[英]async await for virtual method
在我們舊的同步應用程序中,我們的基類中有以下內容:
public virtual bool ShouldSomethingHappen() => false;
所以,這個想法是在派生類中,可以調用數據庫來確定是否應該發生某些事情。
因此,當轉向等待的代碼時,我們首先在基類中嘗試了以下內容:
public virtual async Task<bool> ShouldSomethingHappen()
{
await Task.Yield();
return false;
}
這在運行應用程序時似乎工作正常,但它破壞了我們的集成測試(我們有很多等待的調用)......我們無法弄清楚為什么。
但是,將其更改為以下解決了問題:
public virtual async Task<bool> ShouldSomethingHappen() => Task.FromResult(false);
那么從技術上講,這兩種方法有什么區別?
可能是在await Task.Yield()
之后集成測試中發生的任何事情都沒有設計為在不同的線程上工作。 Task.Yield()
使方法繼續在另一個線程上運行該方法的其余部分。 當您使用Task.FromResult
您將返回已完成的任務。 您只是返回已完成的任務,因此它仍然發生在同一線程上。
您可以通過更改驗證Task.FromResult(false)
以Task.FromResult(false).ConfigureAwait(false)
。await Task.Delay(n).ConfigureAwait(false)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.