我正在練習異步編程,并試圖舉一個簡單的例子來澄清我的問題。這是一個演示,因此目的不是更改同一函式內的標簽,而是使用兩個單獨的函式,即 func1 和 func2。
所以我想通過單擊 Button1 幾乎同時啟動兩個異步函式 func1 和 func2。
但是正如您在下面的代碼中看到的那樣,我必須創建另一個名為 Button2 和 Button2 單擊事件的按鈕,以便與 func1 一起啟動 func2:

namespace AsyncSyncCompWPF
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
public async Task<bool> func1()
{
for (int i=0; i < 100; i )
{
await Task.Delay(100);
labelLeft.Content = i.ToString();
}
return true;
}
public async Task<bool> func2()
{
for (int i = 0; i < 100; i )
{
await Task.Delay(100);
labelRight.Content = i.ToString();
}
return true;
}
private async void Button1_Click(object sender, RoutedEventArgs e)
{
Button2.RaiseEvent(new RoutedEventArgs(ButtonBase.ClickEvent));
await func1();
}
private async void Button2_Click(object sender, RoutedEventArgs e)
{
await func2();
}
}
}
現在,我可以創建一個完全相同的方法,而不是創建按鈕 Button2,這樣我就不必創建額外的按鈕了嗎?(是否需要代表?)
uj5u.com熱心網友回復:
從您的第一個按鈕,您可以呼叫func1和func2作為任務,然后將它們發送到Task.WhenAll將同時運行任務直至完成:
Task<bool> f1 = func1();
Task<bool> f2 = func2();
await Task.WhenAll(f1, f2);
Task.WaitAll將阻止 UI,而Task.WhenAll不會阻止 UI,因為它正在等待。查看Task.WhenAll以了解其作業原理。
由于func1和func2回傳 a Task,因此您不需要await在創建f1和f2變數的背景關系中使用它們,因為您希望它們同時從 運行Task.WhenAll。如果您await在創建變數時執行它們,那么它們將同步運行,一個接一個,并且它們將回傳 a bool,而不是 a Task<bool>。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/344603.html
上一篇:對json資料使用異步的最佳實踐
