[英]Understanding how to use Async without Multithreading
我一直在閱讀有關異步方法的信息,特別是在C#中使用新的async / await關鍵字,並且盡管在該論壇上進行了大量閱讀和閱讀,但我仍然確信異步需要多線程。 請解釋一下我的誤會!
我了解您可以編寫一個異步方法而無需產生后台線程。 超級基本示例:
async System.Threading.Tasks.Task<int> GetZeroAsync()
{
return 0;
}
但是,當然,此方法被標記為異步是完全沒有用的,因為它不是異步的。 正如預期的那樣,我還會收到有關該方法缺少“等待”運算符的編譯器警告。 好吧,那我們還能等什么呢? 我可以等待Task.Run()之類的東西,但是這有點不對勁,因為我現在正在使用多線程。 我在網上找到的任何其他示例都試圖通過簡單的操作來證明您不需要多線程:
async System.Threading.Tasks.Task<int> MyMethodAsync()
{
return await CallAnotherAsyncMethod();
}
也許我對此有誤解,但向我證明的是, 我不是啟動多線程任務的人,而是在調用另一種方法。 由於CallAnotherAsyncMethod()也是一個異步方法,因此它必須遵循完全相同的規則,對嗎? 我不能讓每個異步方法都永遠等待另一個異步子方法,在某些時候它必須停止,除非您想要無限遞歸。
我目前的理解方式(我知道這是錯誤的)是異步不使用多線程,但是它確實需要多線程,否則,它只是一個同步方法。
所以這可能會有所幫助。 如果異步確實不需要多線程,則以下情況必須是可實現的,我只是找不到解決方法。 有人可以創建遵循這些規則的方法的示例:
異步。
實際上是異步運行的。
不使用任何多線程,例如調用Task.Run()或使用BackgroundWorker等。
不調用任何其他異步方法(除非您也可以證明此方法也遵循這些規則)。
不要調用Task類的任何方法,例如Task.Delay()(除非您也可以證明此方法也遵循這些規則)。
任何幫助或澄清將非常有幫助! 我覺得自己是個白痴,不理解這個話題。
不使用任何類型的線程的異步操作的最簡單示例是等待事件發生。
使用您選擇的框架創建一個UI應用程序,並有兩個按鈕,一個稱為PrimeButton
,一個稱為RunButton
private TaskCompletionSource<object> _event = new TaskCompletionSource<object>();
//You are only allowed to do async void if you are writing a event handler!
public async void PrimeButton_OnClick(object sender, EventArgs e)
{
//I moved the code in to Example() so the async void would not be a distraction.
await Example();
}
public async Task Example()
{
await _event.Task;
MessageBox.Show("Run Clicked");
}
public async void RunButton_OnClick(object sender, EventArgs e)
{
_event.SetResult(null);
}
等待將一直等到您單擊第二個按鈕,然后它才能繼續執行代碼並顯示消息框。 這里根本不涉及額外的線程,所有工作僅使用UI線程完成。
一個Task
就是一個代表“ 將來會在某個時候完成的東西 ”的對象。 某個東西可能正在等待由Task.Run
啟動的后台線程完成,或者可能正在等待某個函數被調用,如TaskCompletionSource<T>
上的TaskCompletionSource<T>
.SetResult(
,或者可能正在等待某種磁盤或網絡IO完成並由OS讀入緩沖區(但是在內部,這通常是通過埋在ReadAsync()
函數內部的內部TaskCompletionSource<T>
來實現的,因此這只是最后一個示例的重復)周圍有包裝紙)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.