private void DoWork() { bool isReportSetSignaled = false; if (File.Exists(mFileName)) { using (BinaryReader sReader = new BinaryReader(new FileStream(mFileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite, 100))) { bool isEOF = false; long fromPosition = mFromPosition > StorageHeader.STORAGE_HEADER_SIZE ? mFromPosition : StorageHeader.STORAGE_HEADER_SIZE; long toPosition = mToPosition > 0 && mToPosition < sReader.BaseStream.Length ? mToPosition : sReader.BaseStream.Length; long total = toPosition - fromPosition; long fileLength = sReader.BaseStream.Length; bool isPartial = toPosition < sReader.BaseStream.Length; ReadHeader(sReader, false); sReader.BaseStream.Position = fromPosition; ReportReset(); while (!isClosing) { if (!isEOF) { DataChunk dataChunk = DataChunk.ReadDataChunk(sReader); if (dataChunk != null) { ReportReceiveData(dataChunk); } else { isEOF = true; } if (isPartial && sReader.BaseStream.Position > toPosition) { isEOF = true; } if (total > 0) { ProgressValue = (byte)((sReader.BaseStream.Position - fromPosition) * 100 / total); } } else { ProgressValue = 100; ReportSet(); isReportSetSignaled = true; if (isPartial) { break; } while (!isClosing && isEOF) { Thread.Sleep(100); long newFileLength = sReader.BaseStream.Length; if (newFileLength < fileLength) { fileLength = newFileLength; isEOF = false; ReadHeader(sReader, false); ReportReset(); } else if (newFileLength > fileLength) { fileLength = newFileLength; isEOF = false; } } } } } } IsOpen = false; ProgressValue = 100; if (!isReportSetSignaled) { ReportSet(); } }