Есть BinaryReader и BinaryWriter, которые одновременно пишут и читают. Есть progressBar. При закрытии приложения во время работы получаю Exception в progressBar и с помощью делегата делаю Close() & Dispose() BinaryReader, BinaryWriter и FileStream, который используется в BinaryReader. Тем не менее файл почему то не освобождается.
streamRead - FileStream; reader - BinaryReader;
using (streamRead = new FileStream(filePath, FileMode.Open))
{
reader = new BinaryReader(streamRead);
writer - BinaryWriter
using (writer = new BinaryWriter(File.Open(this.txbxArchivePath.Text + @"\" + this.txbxArchiveName.Text + ".Haffman", FileMode.Create, FileAccess.ReadWrite, FileShare.Read))){ }
метод, который вызываю с помощью делегата:
private void DisposeAll()
{
this.reader.Close();
this.writer.Close();
streamRead.Close();
this.reader.Dispose();
this.writer.Dispose();
streamRead.Dispose();
this.Dispose();
}
На MSDN пишут:
"Не прерывайте поток, выполняющий операцию чтения. Несмотря на то, что приложение может отображаться для успешного выполнения после поток не заблокирован, прерывания может привести к снижению производительности и надежности приложения." скорее всего это и имелось в виду
Наверняка, это и имелось в виду, что выполнение методов Close() & Dispose() может выполниться некорректно.
Попробуйте такой пример:
class MyReader
{
bool _breakReader = false;
public void Close()
{
_breakReader = true;
}
public byte[] Read(string file)
{
byte[] bytes;
try
{
using (FileStream fsSource = new FileStream(file,
FileMode.Open, FileAccess.Read))
{
bytes = new byte[fsSource.Length];
//Здесь можно указать нужный буфер
int numBytesToRead = 1024*1024; //1 МБ
int numBytesRead = 0;
while (numBytesToRead > 0)
{
int n = fsSource.Read(bytes,
numBytesRead, numBytesToRead);
// Здесь будет прерывание считывания
if (n == 0 || _breakReader )
break;
numBytesRead += n;
numBytesToRead -= n;
}
numBytesToRead = bytes.Length;
}
}
catch (FileNotFoundException ioEx)
{
Console.WriteLine(ioEx.Message);
}
return bytes;
}
}
В итоге получается, что мы считываем файл по одному мегабайту, если во время считывания флаг изменился на true, то мы прерываем цикл считывания и корректно закрываем FileStream
Сборка персонального компьютера от Artline: умный выбор для современных пользователей