没有for循环的示例

时间:2018-01-15 13:30:52

标签: c# progress-bar backgroundworker

大多数示例都带有for循环,它们可以工作,并解释BackgroundWorker的工作原理。但是,如何将ProgressBar用于转换数据的方法?这需要几分钟,我想向用户显示该方法的进度。

private void DoWork(object sender, DoWorkEventArgs e)
{
    for (int i = 0; i <= 100; i++)
    {             
        Thread.Sleep(100);
        backgroundWorker.ReportProgress(i);
    }
}

在这里,我总是给我更新值。但是,如果我想这样做呢?

private void DoWork(object sender, DoWorkEventArgs e)
{
    ConvertDataMethod();

    backgroundWorker.ReportProgress(i); <- What do I do here??
}

private void ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    progressBar.Value = e.ProgressPercentage;
}

2 个答案:

答案 0 :(得分:0)

只有在有办法确定当前进度的情况下,才能报告进度。当您无法知道您的手术需要多长时间时,您必须采用其他进度指示方法。有许多方法可以指示您的应用程序执行冗长的操作而不显示实际进度。

Spinner就是一个常见的例子:你实例化你的微调器,make就是开始旋转并运行你的后台工作器。完成背景工作者的工作后,您可以隐藏微调器或将其停止。

这样您就完全不使用ReportProgress(因为您无法通过漫长的转换操作报告进度),您只需表明您的应用程序正在忙于转换。

...
StartSpinner();
worker.DoWork += (sender,eargs) => ConvertDataMethod();
worker.RunWorkerCompleted += (sender,eargs) => StopSpinner();
worker.RunWorkerAsync();
...

答案 1 :(得分:0)

我认为活动更适合您的目的。

1)声明你的EventHandler

public event EventHandler ProgressChanged;

2)然后像这样制作事件方法

protected virtual void OnProgressChanged(CustomEventArgs e)
{
  if (ProgressChanged != null)
  {
    ProgressChanged(this, new CustomEventArgs() { MyValue = e.MyValue });
  }
}

3)如您所见,我为EventArgs声明了自定义类,代码如下。不要忘记从EventArgs类继承。

  class CustomEventArgs : EventArgs
  {
    public int MyValue { get; set; }
  }

4)您必须订阅您的活动

ProgressChanged += Program_ProgressChanged;

private void Program_ProgressChanged(object sender, EventArgs e)
{
  //Your progressBar update here
}

5)最后,您可以使用此代码段

举起活动
OnProgressChanged(new CustomEventArgs()
{
  MyValue = 0 //progressBar Value
});

如果需要使用后台工作人员,请忽略我的答案。

感谢。 :)