在旧的同步应用程序中,我们在基类中具有以下内容:
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);
从技术上讲,两种方法有什么区别?
答案 0 :(得分:2)
在{em> await Task.Yield()
之后的集成测试中,发生的任何事情都不是设计为在其他线程上工作的。 Task.Yield()
导致方法在另一个线程上继续运行该方法的其余部分。使用Task.FromResult
时,您将返回已经完成的任务。您只是返回已完成的任务,因此它仍在同一线程上发生。
您可以通过将Task.FromResult(false)
更改为 Task.FromResult(false).ConfigureAwait(false)
来进行验证。await Task.Delay(n).ConfigureAwait(false)