如果我用 async 重写一个抽象的 void 方法会发生什么?

What happens if I override an abstract void method with async?

如标题所示,我用 override async void 覆盖了 abstract void 方法,但我不确定通过基础 class 调用该方法时会发生什么,因为我不能把 await 放在那里。 线程会挂起直到任务完成,还是表现得好像 await 在那里?

我已经通过其他答案发现我应该使用 Task 作为 return 值以使所有代码更清晰,但我想知道是否也存在行为差异。

为清楚起见,一些代码:

abstract class BaseClass
{
     public abstract void Method();
}

class DerivedClass : BaseClass
{
     public override async void Method()
     {
           await Task.Run(() => SomethingLong());
     }
}

class Caller
{
     public void CallingMethod()
     {
          BaseClass bc = ...;
          bc.Method();
          //What happens here? The task will be fully waited,
          //or the rest of this method will be appended as continuation?

          /*Other code*/
     }
}

由于方法returns void没有调用方法,基础class包含在内,可以await完成。您可以在 async void 方法中自由 await,但无法 await 调用它。

基本上,您生成的方法将 return 立即执行(如果其实现不是阻塞的),并且调用方法将在调用覆盖方法后立即执行代码。该方法及其副作用,因为它是 void,所以已经过时了。这意味着调用者不能依赖于该方法的完成,即不能不依赖于该方法旨在完成的任何事情。

注意:此答案是通过评论提供的。我写这篇文章是为了后代和 answered 标记。