.NET 4.x Два потока в одном процессе, конфликт чтения/записи файлов - C#
Формулировка задачи:
Пробую вникнуть в многопоточность. Хочу написать программу которая создает два потока, которые открывают метод Reader и метод Writer соответственно. Первый открывает и считывает файлы (infile0.txt, infile1.txt и infile2.txt). Второй метод получает от первого считанное и записывает в результирующий файл (outfile.txt). Для передачи данных от потока к потоку использую именованный канал. Считывает только первый файл и всё, записи нет. Не могу понять что я делаю не так. Огромное спасибо за подсказки.
using System; using System.IO; using System.IO.Pipes; using System.Threading; namespace Async { class Program { static ManualResetEvent readEvent = new ManualResetEvent(false); static ManualResetEvent writtenlEvent = new ManualResetEvent(true); static void Main() { Thread readThread = new Thread(Reader); Thread writerThread = new Thread(Writer); readThread.Start(); writerThread.Start(); readThread.Join(5000); Console.WriteLine("The program has completed. For exit, press enter..."); Console.ReadLine(); } static void Reader() { byte[] readArray = new byte[256]; FileStream fStream; Console.WriteLine("The threadReader started"); using (NamedPipeServerStream pipeStream = new NamedPipeServerStream("mypipe")) { pipeStream.WaitForConnection(); // Ожидание соединения к каналу for (int i = 0; i < 3; i++) { writtenlEvent.WaitOne(); // Ожидание сигнала о окончании записи try { fStream = new FileStream("infile" + i + ".txt", FileMode.Open); fStream.Read(readArray, 0, 256); Console.WriteLine("Reader: The \"{0}\" file has been read.", i); } catch (Exception exc) { Console.WriteLine(exc); } pipeStream.Write(readArray, 0, 256); readEvent.Set(); // Сигнал о том что файл прочитан writtenlEvent.Reset(); // Закрыть сигнал о записи } } } static void Writer() { byte[] writeArray = new byte[256]; Console.WriteLine("The threadWriter started"); using (NamedPipeClientStream pipeStream = new NamedPipeClientStream("mypipe")) { pipeStream.Connect(); // Произвести соединение с каналом FileStream fStream = new FileStream("outfile.txt", FileMode.Create); while(true) { readEvent.WaitOne(); // Ожидание сообщения о прочтении файла pipeStream.Read(writeArray, 0, 256); fStream.Write(writeArray, 0, 256); Console.WriteLine("Writer: The \"Outfile\" has been overwritten."); writtenlEvent.Set(); // Запись прошла, можно читать след. файл readEvent.Reset(); // закрыть сигнал о прочтении } } } } }
Решение задачи: «.NET 4.x Два потока в одном процессе, конфликт чтения/записи файлов»
textual
Листинг программы
lock (obj) { // locked method }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д