只是大聲朗讀和思考:如果我在主UI線程中使用await
來調用方法,那就等於是阻塞調用,對,因爲沒有線程調用UI線程?在UI線程上是否使用與阻塞調用相同的await?
例如:
int Main()
{
// This would be a blocking call, right?
await PrintTwoMillionTimes("Hello");
Console.WriteLine("Phew! Done!");
}
只是大聲朗讀和思考:如果我在主UI線程中使用await
來調用方法,那就等於是阻塞調用,對,因爲沒有線程調用UI線程?在UI線程上是否使用與阻塞調用相同的await?
例如:
int Main()
{
// This would be a blocking call, right?
await PrintTwoMillionTimes("Hello");
Console.WriteLine("Phew! Done!");
}
不,絕對不是。
點的await
是它不是塊。假設PrintTwoMillionTimes
的結果行爲合理,異步方法將立即返回...但它會附加一個延續,以便在結果完成時執行其餘的方法(在UI線程上)。
因此,假如你已經有了一個工作示例(目前你的方法聲明不async
,並返回int
,和你沒有任何return
語句...)的流程是:
PrintTwoMillionTimes
被調用,這將啓動一個異步操作,返回表示操作的東西(例如,Task
)如果您從異步方法返回Task
或Task<T>
,則返回值可用於指示異步方法本身何時完成(即在你的Console.WriteLine
執行完畢後)。
這只是一個非常簡單的描述,當然是。你應該更詳細地閱讀async/await。 MSDN是一個合理的出發點。
我不得不承認,我是從成熟的好奇心中提出這個問題的。我仍然在從MSDN學習這些資料。 我對此的好奇心是:如果PrintTwoMillion(無論它是否返回任何內容)在線程池的後臺工作線程上運行,那麼當我從UI線程調用它時,控制流的位置在哪裏?系統在做什麼? UI線程是否也被暫停?或者在此時釋放/處理事件通知。我確信在完成閱讀後我會回答這些問題。我完成之前一點好奇。 :-) –
@ WaterCoolerv2:'PrintTwoMillion' * *有返回的東西,否則你不能等待它。不,UI線程不會被暫停 - 它會保持正常處理事件。然後,當「PrintTwoMillion」完成時,異步方法的其餘部分的延續將在UI線程上進行調度。但是,是的,你基本上應該繼續閱讀。 –
謝謝。你如何在註釋中設置代碼塊的格式? –
否;整點await
是它的不是一個阻塞呼叫。
編譯器將await
之後的代碼轉換爲回調。
只要你等待的東西行爲良好(意味着它不會同步工作),你的用戶界面就沒問題。
謝謝。對不起,我想我提出的問題有點太早了。 –
該代碼不能編譯。你不能在沒有'async'的方法中使用'await'。 –
謝謝。在我問這個問題之前,我應該完成我的閱讀和練習。有時候,我很好奇。 :-) –