异步等待虚方法

问题描述 投票:2回答:1

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

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

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

c# async-await task-parallel-library
1个回答
2
投票

可能是因为在await Task.Yield()设计用于不同线程之后,在集成测试中发生了什么。 Task.Yield()使方法继续在另一个线程上运行该方法的其余部分。当你使用Task.FromResult时,你将返回已经完成的任务。您只是返回已完成的任务,因此它仍然发生在同一个线程上。

您可以通过将Task.FromResult(false)更改为来验证这一点 Task.FromResult(false).ConfigureAwait(false)await Task.Delay(n).ConfigureAwait(false)

© www.soinside.com 2019 - 2024. All rights reserved.