gpt4 book ai didi

c# - 异步等待虚拟方法

转载 作者:行者123 更新时间:2023-11-30 22:58:55 25 4
gpt4 key购买 nike

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

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)

关于c# - 异步等待虚拟方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52626585/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com