从异步等待更新ModalDialog进度条

时间:2018-01-12 13:00:13

标签: c# asynchronous modal-dialog async-await

我试图更好地了解如何使用async和await更新ProgressBar值。

如果进度条在UI主线程上,我可以使用async更新进度条值。但我有模态对话框窗口,其中包含进度条,当我点击按钮时弹出这个模态对话框。

现在我想从Async方法更新此进度条的值。

如何从异步方法更新模态对话框进度条?

P.S - 我不想使用BackgroundWorker。

2 个答案:

答案 0 :(得分:0)

我认为您所寻找的内容可以通过IProgress<T>来完成。 IProgress<T>和默认实现Progress<T>是从另一个上下文报告进度的方法。

查看:Reporting Progress from Async Tasks

来自@StephenCleary的帖子的样本

public async void StartProcessingButton_Click(object sender, EventArgs e)
{
  // The Progress<T> constructor captures our UI context,
  //  so the lambda will be run on the UI thread.
  var progress = new Progress<int>(percent =>
  {
    textBox1.Text = percent + "%";
  });

  // DoProcessing is run on the thread pool.
  await Task.Run(() => DoProcessing(progress));
  textBox1.Text = "Done!";
}

public void DoProcessing(IProgress<int> progress)
{
  for (int i = 0; i != 100; ++i)
  {
    Thread.Sleep(100); // CPU-bound work
    if (progress != null)
      progress.Report(i);
  }
}

答案 1 :(得分:-1)

假设您正在运行WPF应用程序,您可以通过调用当前调度程序来执行此操作

private void PushOnUIThread(Action action)
        {
            if (Application.Current.Dispatcher.CheckAccess())
            {
                action();
            }
            else
            {
                Application.Current.Dispatcher.Invoke(action);
            }
        }

然后你可以打电话

PushOnUIThread(()=> progressBar.Value = 30);