异步等待虚拟方法

时间:2018-10-03 12:00:05

标签: c# async-await task-parallel-library

在旧的同步应用程序中,我们在基类中具有以下内容:

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);

从技术上讲,两种方法有什么区别?

1 个答案:

答案 0 :(得分:2)

在{em> await Task.Yield()之后的集成测试中,发生的任何事情都不是设计为在其他线程上工作的。 Task.Yield()导致方法在另一个线程上继续运行该方法的其余部分。使用Task.FromResult时,您将返回已经完成的任务。您只是返回已完成的任务,因此它仍在同一线程上发生。

您可以通过将Task.FromResult(false)更改为 Task.FromResult(false).ConfigureAwait(false)来进行验证。 await Task.Delay(n).ConfigureAwait(false)