C# 进度条调用/委托(delegate)问题

标签 c# progress-bar

我正在传输文件,想要一个进度条来显示每个文件的实际进度。这适用于 15 兆以下的文件,但大于 15 兆的文件似乎会导致我的应用程序卡住。如果我不为进度条调用此代码,这些较大的文件传输得很好。

我已经尝试了各种不同的方式来与代表一起处理这个问题,但没有成功。相反,它们适用于较小的文件,但不适用于较大的文件。

一些有效的例子...

pbFileProgress.Invoke((MethodInvoker)
   delegate 
   { 
      pbFileProgress.Value = args.PercentDone;
   });                

此外,这组方法适用于较小的文件。

private delegate void SetProgressBarCallback(int percentDone);

public void UpdateProgressBar(object send, UploadProgressArgs args)
{
   if (pbFileProgress.InvokeRequired)
   {
      var d = new SetProgressBarCallback(ProgressBarUpdate);
      BeginInvoke(d, new object[] { args.PercentDone });
   }
   else
   {
      ProgressBarUpdate(args.PercentDone);
   }
}

public void ProgressBarUpdate(int percentDone)
{
   pbFileProgress.Value = percentDone;
}

但同样,如果我尝试更大的文件,一切都会卡住。

最佳答案

尽管缺乏上下文,但这里有一个有效的示例。 BeginInvoke 或 Invoke 方法最多只调用 100 次。

Task.Factory.StartNew(() =>
   {
      using (var source = File.OpenRead(@"D:\Temp\bbe.wav"))
      using (var destination = File.Create(@"D:\Temp\Copy.wav"))
      {
         var blockUnit = source.Length / 100;

         var total = 0L;
         var lastValue = 0;

         var buffer = new byte[4096];
         int count;

         while ((count = source.Read(buffer, 0, buffer.Length)) > 0)
         {
            destination.Write(buffer, 0, count);

            total += count;

            if (blockUnit > 0 && total / blockUnit > lastValue)
            {
               this.BeginInvoke(
                  new Action<int>(value => this.progressBar1.Value = value),
                  lastValue = (int)(total / blockUnit));
            }
         }

         this.BeginInvoke(
            new Action<int>(value => this.progressBar1.Value = value), 100);
      }
   });

关于C# 进度条调用/委托(delegate)问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8406131/

相关文章:

java - 进度条和下载

iphone - 是否有适用于 iOS 的可自定义进度条?

mysql - 处理进度条上显示的 MySQL 查询

c# - C# 中的只读文本框

c# - 可以在 C# 中组合两个 Actions 吗?

c# - 可以打开上传到blob容器中的excel文件吗?

c# - 使用 ajax 调用将模型作为列表从 View 传递到 Controller

c# - 在 Caliburn.micro 中使用 ProgressBar

c# - 在手机上而不是在模拟器中不断收到 ArgumentOutOfRangeException

php - php处理ffmpeg和进度条有什么好的功能