[英]The async and await keywords don't cause additional threads to be created?
[英]Async methods don't require additional threads?
在MSDN中,有一個這樣的段落:
async和await關鍵字不會導致創建其他線程。 異步方法不需要多線程,因為異步方法不能在自己的線程上運行。 該方法在當前同步上下文上運行,並僅在方法處於活動狀態時在線程上使用時間。 您可以使用Task.Run將CPU綁定的工作移動到后台線程,但后台線程無助於只等待結果可用的進程。
但看起來我需要對粗體文本提供更多幫助,因為我不確定它究竟意味着什么。 那么如何在不使用Threads
情況下變為async
?
資料來源: http : //msdn.microsoft.com/en-us/library/hh191443.aspx
async / await不只是關於使用更多線程。 這是關於更有效地使用你擁有的線程。 當操作阻塞時,例如等待下載或文件讀取,async / await模式允許您將該現有線程用於其他操作。 編譯器處理下面的所有魔法管道,使其更容易開發。
有關問題描述和白皮書,請訪問http://msdn.microsoft.com/en-us/magazine/hh456401.aspx , 網址為http://www.microsoft.com/en-us/download/details.aspx?id= 14058
不是async和await關鍵字自己生成的代碼,不是。 它們創建在當前線程上運行的代碼,假設它具有同步上下文。 如果它沒有那么你實際上得到了線程,但是沒有充分理由使用該模式。 await表達式 ,你在await關鍵字右側寫的內容會導致線程運行。
但是該線程通常是不可觀察的,它可能是設備驅動程序線程。 報告說它是通過I / O完成端口完成的。 非常常見,I / O始終是使用等待的好理由。 如果WinRT沒有強制你,那就是async / await被添加的真正原因。
關於“具有同步上下文”的說明。 如果SynchronizationContext.Current屬性不為null,則在線程上有一個。 這幾乎只是gui應用程序主線程的情況。 此外,您通常擔心延遲的唯一地方不會凍結您的用戶界面。
基本上它正在做的是當你運行async
方法而不用await
調用它是這樣的:
啟動方法並盡可能地同步執行。
必要時,暫停方法並將其余部分放入延續中。
當異步部分完成(不再等待)時,安排繼續在同一個線程上運行。
無論你想要什么,都可以正常運行在這個線程上。 您甚至可以檢查/操作從異步方法返回的Task
。
當線程可用時,它將運行您的方法的其余部分。
“異步部分”可以是文件IO,Web請求或幾乎任何內容,只要調用代碼可以等待此任務完成即可。 這包括但不限於單獨的線程。 正如Reed Copsey所指出的,還有其他方法可以執行異步操作,例如中斷。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.