[英]Calling Async Method from Sync Method
我看到很多關於從同步方法調用異步方法的問題,例如: How to call asynchronous method from synchronous method in C#?
我理解解決方案,但是,通過實驗,我發現我不需要添加Task.Run(async () => await MyAsyncMethod())
.Wait()
或Task.Run(async () => await MyAsyncMethod())
讓它同步運行。 我有一個從數據庫中提取信息的 get 方法。
我的代碼在下面,當我運行時,它等待var task = GetItemAsync()
並且我從數據庫中獲得正確的結果。 我發現很難相信 DB 調用會在代碼繼續運行之前返回,這似乎意味着它是同步運行的。 我錯過了什么嗎?
public object GetItem()
{
var task = GetItemAsync();
var result = task.Result;
return result
}
System.Threading.Tasks.Task.Result 是等待任務完成的阻塞調用。 所以它本質上有一個內置的等待調用。
在該微軟文檔的備注部分:
訪問屬性的 get 訪問器會阻塞調用線程,直到異步操作完成; 相當於調用了Wait方法。
遺憾的是,微軟並沒有在訪問器的名稱中體現這一點,因為這是訪問器的一個極其關鍵的副作用。
調用 awaitable(method which returns Task
) 方法的唯一正確方法是await
它。 但是您只能在返回Task
的方法中await
。 在遺留代碼中,您無法更改方法簽名,因為您有太多引用,並且基本上需要重構整個代碼庫。 所以你有這些選擇:
.Result
.Wait()
.GetAwaiter().GetResult()
這兩個都不好。 所有這些都會block the thread
。 但是,如果您無法更改方法簽名以await
執行,我會選擇最后一個選項 - GetAwaiter().GetResult()
因為它不會將異常包裝到AggregateException
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.