我正在用異步CTP進行一些探測,但由於GUI被阻塞,我沒有得到好的結果。異步CTP:我做錯了,GUI被阻止
我有一個WPF應用程序的按鈕和文本框的日誌。然後,我有這樣的代碼:
private async void btnAsync01_Click(object sender, RoutedEventArgs e)
{
UpdateTxtLog("Enter in Button Async01: " + System.DateTime.Now);
await metodo01Async();
UpdateTxtLog("Exit button Async01: " + System.DateTime.Now);
}
private async Task slowMethodAsync()
{
UpdateTxtLog("Enter in slowMethod: " + System.DateTime.Now);
Thread.Sleep(5000);
UpdateTxtLog("Exit slowMethod: " + System.DateTime.Now);
}
如果我沒有錯,設定爲「同步」(在這種情況下,單擊事件),它讓該方法使用的await,給點返回到執行該方法的方法它調用實際的方法,然後執行返回到GUI。
所以在GUI中,我單擊按鈕,然後在clickMethod的click事件中等待,我如何使用slowMethod等待控件返回到GUI,然後GUI不應該被阻止。但是,圖形用戶界面被阻止,txtLog不顯示任何信息,直到slowMethod完成。
這是因爲slowMethod在與GUI相同的線程中執行嗎?如果我錯了,使用異步通常使用與調用await方法的方法相同的線程,但我認爲異步的原因可以避免這種情況。
我該如何模擬一個沒有thread.Sleep的slowMethod?也許這就是問題所在,因爲在slowMethod中,我睡眠線程,而slowMethod的線程與GUI相同。
這讓我覺得總是推薦在其他線程中執行異步方法的代碼?如果這是正確的,如果我還需要使用任務來阻止主線程,那麼使用異步的意義是什麼?
何時使用異步和何時使用任務?
對於這個探頭,我下面這個網站的例子:http://www.codeproject.com/Articles/127291/C-5-0-vNext-New-Asynchronous-Pattern
在這個例子中,它被用來作爲client.DownloadStringTaskAsync slowMethod,但對我來說,而是採用了Web客戶端,我用一個虛擬的方法,用睡眠模擬slowMethod。我認爲這是唯一的區別。
謝謝。 Daimroc。