我目前有一个Task,它启动一个方法并循环给定的时间。每个循环我都想模拟一些正在完成的工作(Thread.Sleep),然后再更新UI。我当前知道的更新UI线程的唯一方法是任务继续。我的问题是在该方法中,我没有任务要继续。
private void StartButton_Click(object sender, RoutedEventArgs e)
{
this.pbStatus.Value = 0;
Task.Run(() => StartProcess(100));
//Show message box to demonstrate that StartProcess()
//is running asynchronously
MessageBox.Show("Called after async process started.");
}
// Called Asynchronously
private void StartProcess(int max)
{
for (int i = 0; i <= max; i++)
{
//Do some work
Thread.Sleep(10);
//How to correctly update UI?
this.lblOutput.Text = i.ToString();
this.pbStatus.Value = i;
}
}
是否有一种方法可以重构此代码以仅使用TPL来工作?预先感谢。
答案 0 :(得分:2)
您可以使用IProgress<T>
向UI线程报告进度。
private void StartButton_Click(object sender, RoutedEventArgs e)
{
this.pbStatus.Value = 0;
//Setup the progress reporting
var progress = new Progress<int>(i =>
{
this.lblOutput.Text = i.ToString();
this.pbStatus.Value = i;
});
Task.Run(() => StartProcess(100, progress));
//Show message box to demonstrate that StartProcess()
//is running asynchronously
MessageBox.Show("Called after async process started.");
}
// Called Asynchronously
private void StartProcess(int max, IProgress<int> progress)
{
for (int i = 0; i <= max; i++)
{
//Do some work
Thread.Sleep(10);
//Report your progress
progress.Report(i);
}
}