带文件流的进度条C#

问题描述 投票:0回答:1

如有任何帮助,我们将不胜感激。

我对线程的东西不太了解。我试图在不使用 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;
    }
}
c# progress-bar
1个回答
0
投票

有几个选项。

最简单的方法是将进度转发给

ProcessFiles
并让其处理。但如果第三方代码正在执行实际的大部分读取操作,则这可能不可行。除非图书馆确实支持进度报告。

另一种选择是将

Stream
包装在自定义的“ProgressStream”类中,该类在读取数据时定期报告进度。但 Stream 类相当大,所以我认为做好这件事相当具有挑战性。

第三个选项是使用计时器来轮询流的

.Position
属性。请注意,这在技术上不是线程安全的,因为 Stream 不是线程安全的,但我预计最糟糕的是一个不正确的值,这对于报告进度可能没问题。这也会使代码变得更加复杂,因为计时器和读取需要共享相同的流。

但是您真的需要读取文件的真实进度报告吗?也许不确定的进度条就足够了?您正在读取多少数据,速度与磁盘的理论速度相比如何?如果您要存储/读取大量数据,也许您可以以某种更智能的方式存储该数据,以避免需要一次读取全部数据?根据我的经验,本地文件访问很少慢到足以保证进度报告。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.