簡體   English   中英

異步等待虛方法

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

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