.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
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4.091 из 5
Похожие ответы