如果我用 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
标记。
如标题所示,我用 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
标记。