Многопоточность и запись в файл - C#
Формулировка задачи:
Здравствуйте. Мне нужно создать файл и записать в него информацию, для этого нужно использовать многопоточность.
Много читал здесь на форуме, и не только здесь(но все равно плохо понял), получился такой код.
И метот WriteBytes:
Если я правильно понимаю, замок блокирует StreamToRead когда к нему обращается первый Thread, и этот первый Thread в итоге не отпускает его до "победного". После этого доступ получает второй поток, и делает абсолютно то же самое что и первый, тем самым дублируя работу, а не выполняя ее паралельно. Так ли это? Или я что-то не правильно понимаю.
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();
}
} 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);
}
}
}Решение задачи: «Многопоточность и запись в файл»
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);
}
}