异步等待虚方法
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)
以上是关于异步等待虚方法的主要内容,如果未能解决你的问题,请参考以下文章