我正在嘗試異步CTP,允許使用異步方法而無需編寫開始/結束方法的版本4.5。當方法返回void時,是否與任務相同?
我的第一個探針是執行一個返回void的異步方法。我看幾個例子,並做到以下幾點:
private void btnAsync01_Click(object sender, RoutedEventArgs e)
{
UpdateTxtLog("click button: " + System.DateTime.Now);
method01Async();
UpdateTxtLog("after ethod01Async: " + System.DateTime.Now);
}
private async void method01Async()
{
await TaskEx.Run(() =>
{
UpdateTxtLog("Enter method01Async: " + System.DateTime.Now);
Thread.Sleep(10000);
UpdateTxtLog("exit method01Async: " + System.DateTime.Now);
});
}
在我的WPF項目我有一個文本框,在那裏看到,執行異步方法的結果和一個按鈕。
在異步方法中,我使用await,即需要因爲方法是異步的,而TasEx.Run創建一個新線程來執行代碼。
我的疑問是在這一點上。在我看到的有關如何創建返回void的異步方法的幾個示例中,使用這種方式即Task.Run或TaskEx.Run。
如果我沒有錯,Task.Run創建一個新的線程在哪裏執行該方法。那麼爲什麼要使用異步方法,如果使用Task,創建一個新線程,我得到我想要的,而不是阻止主線程?
此外,如果異步方法訪問某個共享變量,我必須小心併發性,對嗎?所以我不知道使用異步方法的好處,至少在這種情況下。
事實上,我使用相同的代碼,沒有異步,沒有等待,結果是一樣的,主程序沒有阻塞,所有的工作如我所料。方法是這樣的:
private void method01Async()
{
TaskEx.Run(() =>
{
UpdateTxtLog("Enter method01Async: " + System.DateTime.Now);
Thread.Sleep(10000);
UpdateTxtLog("Exit method01Async: " + System.DateTime.Now);
});
}
我的問題是,這是在方法返回無效時使用異步的正確方法?
順便說一句,在Visual Studio 11 Beta版現已脫離,其中包含從異步CTP功能,有一些改進和bug修復。 – svick 2012-04-06 14:15:56
在這種情況下,如果在我使用任務的方法中,並且任務使用niew線程,那麼哪種方法可以使用異步方法?如果我直接使用任務,而不使用異步方法,那麼我會得到這種行爲。 也許異步方法更有意義,如果方法返回一個值,而對於void方法,最好直接使用一個任務? – 2012-04-06 14:32:42
我強烈建議所有'async'方法都返回'Task'或'Task',除非它們是事件處理程序並且*有*返回'void'。這使您可以在必要時編寫它們,並且錯誤處理也更清晰(如果'async void'方法在WPF上下文中引發異常,則它將直接發送到UI消息循環,因此'async void'方法*而不是真正的「火和忘記」)。 –
2012-04-06 14:55:50