[英]Updating UI from the async method
通過單擊調用RunAsync(int)方法的方法,我有一個帶有TextBlock和Button控件的 MainWindow。 它正在做一些計算,所以這個過程花費了相當長的時間並阻塞了 UI。 我能夠將它移動到異步線程,但我完全堅持如何最好地實現在For循環的每次迭代中從該方法更新接口。 例如,使用進度條。
目前我有以下代碼:
public partial class MainWindow : Window
{
public MainWindow() => InitializeComponent();
private async Task<List<int>> RunAsync(int par)
{
return await Task.Run(() =>
{
List<int> list = new List<int>();
for (int i = 0; i < par; i++)
{
// some code, that takes quite a long time
Thread.Sleep(500);
list.Add(i);
}
return list;
});
}
private async void StartBtn_Click(object sender, RoutedEventArgs e)
{
int count = (await RunAsync(5)).Count;
label.Text = count.ToString();
}
}
如何最好地實現在 For 循環的每次迭代中從此方法更新接口。 例如,使用進度條。
這就是IProgress<T>
的用途。
附帶說明一下,如果您使用Task.Run
調用方法而不是 * them using
,您會發現您的代碼更簡潔。
public partial class MainWindow : Window
{
private List<int> Run(int par, IProgress<int> progress)
{
List<int> list = new List<int>();
for (int i = 0; i < par; i++)
{
// some code, that takes quite a long time
Thread.Sleep(500);
list.Add(i);
progress?.Report(i);
}
return list;
}
private async void StartBtn_Click(object sender, RoutedEventArgs e)
{
var progress = new Progress<int>(report => /* Do something with report */);
var list = await Task.Run(() => Run(5, progress));
label.Text = list.Count.ToString();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.