我试图更好地了解如何使用async和await更新ProgressBar值。
如果进度条在UI主线程上,我可以使用async更新进度条值。但我有模态对话框窗口,其中包含进度条,当我点击按钮时弹出这个模态对话框。
现在我想从Async方法更新此进度条的值。
如何从异步方法更新模态对话框进度条?
P.S - 我不想使用BackgroundWorker。
答案 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);