C# 从基类重写异步void事件处理程序方法
我不确定如何处理以下情况。有一个接口定义事件处理方法“onSomethinAccounting()” 有一个基类将其作为虚拟方法实现,并在其中使用一些异步代码 有一个派生类要重写虚方法,但也要调用C# 从基类重写异步void事件处理程序方法,c#,inheritance,async-await,C#,Inheritance,Async Await,我不确定如何处理以下情况。有一个接口定义事件处理方法“onSomethinAccounting()” 有一个基类将其作为虚拟方法实现,并在其中使用一些异步代码 有一个派生类要重写虚方法,但也要调用base.OnSomethingHappening() 问题是,我无法将方法调用标记为等待,因为它返回void。事件处理程序可以使用异步void方法,因此不能将其更改为任务(这也不是我的代码) 那么,在使用自己的代码之前,我应该如何确保派生类正确执行base.onSomethingApping() 此解
base.OnSomethingHappening()
问题是,我无法将方法调用标记为等待,因为它返回void。事件处理程序可以使用异步void方法,因此不能将其更改为任务(这也不是我的代码)
那么,在使用自己的代码之前,我应该如何确保派生类正确执行base.onSomethingApping()
此解决方案在派生类中有意义吗
public override async void OnSomethingHappening()
{
await Task.Run(()=> base.OnSomethingHappening());
//some more code
}
那么,在开始编写自己的代码之前,我应该如何确保派生类正确执行base.onSomethingApping()
你没有。这就是为什么应该避免使用
异步void
方法的原因。它们无法让调用方知道操作何时完成,是否成功完成,或者错误是什么(如果有)。如果您希望能够确保调用方能够知道有关该方法的信息,它需要返回一个任务
,而不是void
,对,但是async void
不是事件处理程序的既定模式吗?无论如何,这不是我的代码,而是一个相当完善的框架(Prism),有这个框架,我必须处理它…@Bartoszasync void
是异步操作的一种既定模式,在这种模式中,调用者不想知道操作何时完成,以及是否成功或为什么失败。事件处理程序是存在这种情况的常见情况,但并非所有事件处理程序都处于这种情况,正如并非所有不关心操作何时结束的情况都是事件处理程序一样。如果您想知道方法何时结束,它需要返回一个任务
,这是异步
方法固有的。重写事件处理程序或等待它完成也是不寻常的。通常,事件处理程序将彼此独立运行。我也有同样的问题@斯蒂芬·克利里,你能帮忙吗?
public override async void OnSomethingHappening()
{
await Task.Run(()=> base.OnSomethingHappening());
//some more code
}