Многопоточность и запись в файл - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Мне нужно создать файл и записать в него информацию, для этого нужно использовать многопоточность. Много читал здесь на форуме, и не только здесь(но все равно плохо понял), получился такой код.
        using (FileStream orignialFileStream = File.OpenRead(sourceFileName))
        using (FileStream finalFileStream = File.Create(finalFileName))
        {
            Thread[] threads = new Thread[threadsCount];
            for (int i = 0; i < threadsCount; i++)
            {
                threads[i] = new Thread(() => WriteBytes(orignialFileStream, finalFileStream));
            }
            foreach (Thread t in threads)
            {
                t.Start();
            }
        }
И метот WriteBytes:
        private void WriteBytes(Stream streamToRead, Stream streamToWrite)
        {
            lock (loker)
            {
                byte[] buffer = new byte[bufferSize];
                int nRead = 0;
                while ((nRead = streamToRead.Read(buffer, 0, buffer.Length)) > 0)
                {
                    streamToWrite.Write(buffer, 0, nRead);
                }
            }
        }
Если я правильно понимаю, замок блокирует StreamToRead когда к нему обращается первый Thread, и этот первый Thread в итоге не отпускает его до "победного". После этого доступ получает второй поток, и делает абсолютно то же самое что и первый, тем самым дублируя работу, а не выполняя ее паралельно. Так ли это? Или я что-то не правильно понимаю.

Решение задачи: «Многопоточность и запись в файл»

textual
Листинг программы
 private void ReadFile()
        {
            using (FileStream fileStream = new FileStream(sourceFileInfo.FullName, FileMode.Open, FileAccess.Read))
            {
                blockManager.CreateDataBlocksFromStream(fileStream);
            }
        }
        private void WriteFile()
        {
            using (FileStream fileStream = new FileStream(newFileInfo.Name, FileMode.Create, FileAccess.Write))
            using (GZipStream gzipStream = new GZipStream(fileStream, CompressionMode.Compress))
            {
                blockManager.WriteDataBlocksToFile(gzipStream);
            }
        }

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


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

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

7   голосов , оценка 3.571 из 5