如有任何帮助,我们将不胜感激。
我对线程的东西不太了解。我试图在不使用 for 循环的情况下获得一个进度条来处理流。有什么想法吗?
private async void btnFileStream_Click(object sender, EventArgs e)
{
// Try these:
string strBIGFile = @"C:\BigFile_x86_64.iso";
string strFile2 = @"C:\Verify.txt";
string strFile3 = @"C:\key.txt";
IProgress<int> progress = new Progress<int>(value => progressBar1.Value = value);
await Task.Run(() =>
{
using (Stream dataStream = File.OpenRead(strBIGFile))
{
using (Stream Stream2 = File.OpenRead(strFile2))
{
using (Stream Stream3 = File.OpenRead(strFile3))
{
long length = dataStream.Length;
progress.Report(((int)length));
ProcessFiles(dataStream, Stream2, Stream3);
}
}
}
});
progressBar1.Value = 0;
}
}
有几个选项。
最简单的方法是将进度转发给
ProcessFiles
并让其处理。但如果第三方代码正在执行实际的大部分读取操作,则这可能不可行。除非图书馆确实支持进度报告。
另一种选择是将
Stream
包装在自定义的“ProgressStream”类中,该类在读取数据时定期报告进度。但 Stream 类相当大,所以我认为做好这件事相当具有挑战性。
第三个选项是使用计时器来轮询流的
.Position
属性。请注意,这在技术上不是线程安全的,因为 Stream 不是线程安全的,但我预计最糟糕的是一个不正确的值,这对于报告进度可能没问题。这也会使代码变得更加复杂,因为计时器和读取需要共享相同的流。
但是您真的需要读取文件的真实进度报告吗?也许不确定的进度条就足够了?您正在读取多少数据,速度与磁盘的理论速度相比如何?如果您要存储/读取大量数据,也许您可以以某种更智能的方式存储该数据,以避免需要一次读取全部数据?根据我的经验,本地文件访问很少慢到足以保证进度报告。