2013-01-23 46 views
2

只是大聲朗讀和思考:如果我在主UI線程中使用await來調用方法,那就等於是阻塞調用,對,因爲沒有線程調用UI線程?在UI線程上是否使用與阻塞調用相同的await?

例如:

int Main() 
{ 
    // This would be a blocking call, right? 
    await PrintTwoMillionTimes("Hello"); 

    Console.WriteLine("Phew! Done!"); 
} 
+0

該代碼不能編譯。你不能在沒有'async'的方法中使用'await'。 –

+0

謝謝。在我問這個問題之前,我應該完成我的閱讀和練習。有時候,我很好奇。 :-) –

回答

4

不,絕對不是。

點的await是它不是塊。假設PrintTwoMillionTimes的結果行爲合理,異步方法將立即返回...但它會附加一個延續,以便在結果完成時執行其餘的方法(在UI線程上)。

因此,假如你已經有了一個工作示例(目前你的方法聲明不async,並返回int,和你沒有任何return語句...)的流程是:

  • 異步方法開始
  • PrintTwoMillionTimes被調用,這將啓動一個異步操作,返回表示操作的東西(例如,Task
  • 生成的代碼將CH埃克操作是否已經完成:
    • 如果它已經完成,繼續執行
    • 否則,繼續連接到任務(或任何代表着操作)和異步方法返回

如果您從異步方法返回TaskTask<T>,則返回值可用於指示異步方法本身何時完成(即在你的Console.WriteLine執行完畢後)。

這只是一個非常簡單的描述,當然是。你應該更詳細地閱讀async/await。 MSDN是一個合理的出發點。

+0

我不得不承認,我是從成熟的好奇心中提出這個問題的。我仍然在從MSDN學習這些資料。 我對此的好奇心是:如果PrintTwoMillion(無論它是否返回任何內容)在線程池的後臺工作線程上運行,那麼當我從UI線程調用它時,控制流的位置在哪裏?系統在做什麼? UI線程是否也被暫停?或者在此時釋放/處理事件通知。我確信在完成閱讀後我會回答這些問題。我完成之前一點好奇。 :-) –

+0

@ WaterCoolerv2:'PrintTwoMillion' * *有返回的東西,否則你不能等待它。不,UI線程不會被暫停 - 它會保持正常處理事件。然後,當「PrintTwoMillion」完成時,異步方法的其餘部分的延續將在UI線程上進行調度。但是,是的,你基本上應該繼續閱讀。 –

+0

謝謝。你如何在註釋中設置代碼塊的格式? –

5

否;整點await是它的不是一個阻塞呼叫。
編譯器將await之後的代碼轉換爲回調。

只要你等待的東西行爲良好(意味着它不會同步工作),你的用戶界面就沒問題。

+0

謝謝。對不起,我想我提出的問題有點太早了。 –