問題代碼: xmal:一個按鈕+一個顯示框 1 <Button Width="100" Height="50" Margin="10" Click="Button_Click">test</Button> 2 <TextBox x:Name="display" Width="300" Height= ...
問題代碼:
xmal:一個按鈕+一個顯示框
1 <Button Width="100" Height="50" Margin="10" Click="Button_Click">test</Button> 2 <TextBox x:Name="display" Width="300" Height="300"></TextBox>
cs:點擊按鈕,顯示結果
async Task<int> getResult() { await Task.Delay(1000); return 10; } private void Button_Click(object sender, RoutedEventArgs e) { display.Text = "Starting to get Result..........\n"; var t= getResult().Result; display.AppendText($"The result is:{t}\n"); }
Button_Click事件處理中獲取非同步方法getResult的結果, getResult只是簡單等待1s後返回結果,卻並沒有如預期返回。
分析:
getResult中遇到await後,主線程返回等待結果,await處非同步線程執行完之後,後面的任務仍交由主線程去處理(返回結果),而主線程在等待結果,造成死迴圈。
解決辦法:
- 主線程非同步等待結果(click事件也要改寫成async)
var t=await getResult();
-
await任務執行完之後仍交於當前線程處理後續步驟(返回結果)
await Task.Delay(1000).ConfigureAwait(false)
翻譯
搜索
複製