Exemple #1
0
        static void Main(string[] args)
        {
            using (var mre = new ManualResetEvent(false))
            {
                var ctrl = new AsyncController();
                ctrl.AllDone = () => { mre.Set(); };

                // rozpocznij asynchroniczny odczyt z pliku
                ctrl.BeginOperation(ReadFileOperation(ctrl));

                mre.WaitOne();
            }
            Console.WriteLine("all done!");
            Console.ReadKey();
        }
Exemple #2
0
        static void Main(string[] args)
        {
            using (var mre = new ManualResetEvent(false))
            {
                var ctrl = new AsyncController();
                ctrl.AllDone = () => { mre.Set(); };

                // rozpocznij asynchroniczny odczyt z pliku
                ctrl.BeginOperation(ReadFileOperation(ctrl));

                mre.WaitOne();
            }
            Console.WriteLine("all done!");
            Console.ReadKey();
        }
Exemple #3
0
        // metoda, ktora de-facto implementuje maszyne stanowa pozwalajaca na asynchroniczny
        // odczyt pliku w obrebie jednej metody z zachowaniem wszystkich udogodnien jezyka!
        static IEnumerator <int> ReadFileOperation(AsyncController ctrl)
        {
            // otworz plik - dyrektywa USING!!
            using (var fs = new FileStream("Content.txt",
                                           FileMode.Open,
                                           FileAccess.Read,
                                           FileShare.Read,
                                           512,
                                           // otworz plik w trybie asynchronicznym!
                                           FileOptions.Asynchronous))
            {
                byte[] buffer = new byte[fs.Length];
                // rozpocznij odczyt
                // UWAGA - parametr callback odnosi sie do metody w kontrolerze maszyny stanowej
                IAsyncResult ar = fs.BeginRead(
                    buffer,
                    0,
                    buffer.Length,
                    ctrl.AsyncOperationCompleted,
                    null);

                Console.WriteLine("Starting async operation on thread: "
                                  + Thread.CurrentThread.ManagedThreadId);

                // zwroc kontrole do kontrollera maszyny stanowej - wykonanie kodu jest przerwane!
                yield return(1);

                // ta linia kodu jest wykonywana po zakonczeniu odczytu - kontroller
                // maszyny stanowej wznawia iteracje!
                int bytesRead = fs.EndRead(ar);

                // odczyt danych
                using (var ms = new MemoryStream(buffer))
                    using (var str = new StreamReader(ms))
                    {
                        string fileName = null;

                        // odczyt danych z pilku - linia po linii
                        while (!string.IsNullOrEmpty(fileName = str.ReadLine()))
                        {
                            // dla każdej linii - sprobuj otworzy nowy plik
                            using (var contentFs = new FileStream(
                                       fileName,
                                       FileMode.Open,
                                       FileAccess.Read,
                                       FileShare.Read,
                                       512,
                                       // otworz plik w trybie asynchronicznym!
                                       FileOptions.Asynchronous))
                            {
                                buffer = new byte[contentFs.Length];
                                // rozpocznij odczyt z pliku
                                IAsyncResult contentAr = contentFs.BeginRead(
                                    buffer,
                                    0,
                                    buffer.Length,
                                    ctrl.AsyncOperationCompleted,
                                    null);

                                // poczekaj az dane zostana odczytane
                                yield return(1);

                                contentFs.EndRead(contentAr);

                                // i wyswietl je na konsole
                                using (var contentMs = new MemoryStream(buffer))
                                    using (var contentStr = new StreamReader(contentMs))
                                    {
                                        Console.Write(contentStr.ReadToEnd());
                                    }
                            }
                        }

                        Console.WriteLine("Read Completed on thread " +
                                          Thread.CurrentThread.ManagedThreadId);
                    }
                // zakonczenie przetwarzania - nie ma wiecej operacji do wykonania!
            }
        }
Exemple #4
0
        // metoda, ktora de-facto implementuje maszyne stanowa pozwalajaca na asynchroniczny
        // odczyt pliku w obrebie jednej metody z zachowaniem wszystkich udogodnien jezyka!
        static IEnumerator<int> ReadFileOperation(AsyncController ctrl)
        {
            // otworz plik - dyrektywa USING!!
            using (var fs = new FileStream("Content.txt",
                FileMode.Open,
                FileAccess.Read,
                FileShare.Read,
                512,
                // otworz plik w trybie asynchronicznym!
                FileOptions.Asynchronous))
            {

                byte[] buffer = new byte[fs.Length];
                // rozpocznij odczyt
                // UWAGA - parametr callback odnosi sie do metody w kontrolerze maszyny stanowej
                IAsyncResult ar = fs.BeginRead(
                    buffer,
                    0,
                    buffer.Length,
                    ctrl.AsyncOperationCompleted,
                    null);

                Console.WriteLine("Starting async operation on thread: "
                    + Thread.CurrentThread.ManagedThreadId);

                // zwroc kontrole do kontrollera maszyny stanowej - wykonanie kodu jest przerwane!
                yield return 1;

                // ta linia kodu jest wykonywana po zakonczeniu odczytu - kontroller
                // maszyny stanowej wznawia iteracje!
                int bytesRead = fs.EndRead(ar);

                // odczyt danych
                using (var ms = new MemoryStream(buffer))
                using (var str = new StreamReader(ms))
                {
                    string fileName = null;

                    // odczyt danych z pilku - linia po linii
                    while (!string.IsNullOrEmpty(fileName = str.ReadLine()))
                    {
                        // dla każdej linii - sprobuj otworzy nowy plik
                        using (var contentFs = new FileStream(
                            fileName,
                            FileMode.Open,
                            FileAccess.Read,
                            FileShare.Read,
                            512,
                            // otworz plik w trybie asynchronicznym!
                            FileOptions.Asynchronous))
                        {
                            buffer = new byte[contentFs.Length];
                            // rozpocznij odczyt z pliku
                            IAsyncResult contentAr = contentFs.BeginRead(
                                buffer,
                                0,
                                buffer.Length,
                                ctrl.AsyncOperationCompleted,
                                null);

                            // poczekaj az dane zostana odczytane
                            yield return 1;

                            contentFs.EndRead(contentAr);

                            // i wyswietl je na konsole
                            using (var contentMs = new MemoryStream(buffer))
                            using (var contentStr = new StreamReader(contentMs))
                            {
                                Console.Write(contentStr.ReadToEnd());
                            }
                        }
                    }

                    Console.WriteLine("Read Completed on thread " +
                        Thread.CurrentThread.ManagedThreadId);

                }
                // zakonczenie przetwarzania - nie ma wiecej operacji do wykonania!
            }
        }