簡體   English   中英

從異步方法更新 UI

[英]Updating UI from the async method

通過單擊調用RunAsync(int)方法的方法,我有一個帶有TextBlockButton控件的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM