异步等待虚方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了异步等待虚方法相关的知识,希望对你有一定的参考价值。

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

public virtual bool ShouldSomethingHappen() => false;

因此,我们的想法是在派生类中,可以对DB进行调用以确定是否应该发生某些事情。

因此,在转移到等待的代码时,我们首先在基类中尝试以下内容:

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)

以上是关于异步等待虚方法的主要内容,如果未能解决你的问题,请参考以下文章

使用Task.Wait而不是等待异步编程

关于其活动的片段生命周期

将回调代码改进为异步等待猫鼬

不使用异步等待的异步等待

这是使用异步/等待的正确方法吗?

在没有等待的情况下使用异步?