簡體   English   中英

從同步方法調用異步方法

[英]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
}

請參閱Task<>.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.

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