簡體   English   中英

異步方法不需要額外的線程?

[英]Async methods don't require additional threads?

在MSDN中,有一個這樣的段落:

async和await關鍵字不會導致創建其他線程。 異步方法不需要多線程,因為異步方法不能在自己的線程上運行。 該方法在當前同步上下文上運行,並僅在方法處於活動狀態時在線程上使用時間。 您可以使用Task.Run將CPU綁定的工作移動到后台線程,但后台線程無助於只等待結果可用的進程。

但看起來我需要對粗體文本提供更多幫助,因為我不確定它究竟意味着什么。 那么如何在不使用Threads情況下變為async

資料來源: http//msdn.microsoft.com/en-us/library/hh191443.aspx

有許多異步操作不需要使用多個線程。 像異步IO這樣的東西通過中斷來工作,這些中斷在數據可用時發出信號。 這允許您進行不使用額外線程的異步調用 - 當信號發生時,操作完成。

Task.Run可用於創建自己的基於CPU的異步方法,這些方法將在其自己的單獨線程上運行。 該段旨在表明這不是唯一的選擇。

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調用它是這樣的:

  1. 啟動方法並盡可能地同步執行。

  2. 必要時,暫停方法並將其余部分放入延續中。

  3. 當異步部分完成(不再等待)時,安排繼續在同一個線程上運行。

  4. 無論你想要什么,都可以正常運行在這個線程上。 您甚至可以檢查/操作從異步方法返回的Task

  5. 當線程可用時,它將運行您的方法的其余部分。

“異步部分”可以是文件IO,Web請求或幾乎任何內容,只要調用代碼可以等待此任務完成即可。 這包括但不限於單獨的線程。 正如Reed Copsey所指出的,還有其他方法可以執行異步操作,例如中斷。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM