C# 从基类重写异步void事件处理程序方法

C# 从基类重写异步void事件处理程序方法,c#,inheritance,async-await,C#,Inheritance,Async Await,我不确定如何处理以下情况。有一个接口定义事件处理方法“onSomethinAccounting()” 有一个基类将其作为虚拟方法实现,并在其中使用一些异步代码 有一个派生类要重写虚方法,但也要调用base.OnSomethingHappening() 问题是,我无法将方法调用标记为等待,因为它返回void。事件处理程序可以使用异步void方法,因此不能将其更改为任务(这也不是我的代码) 那么,在使用自己的代码之前,我应该如何确保派生类正确执行base.onSomethingApping() 此解

我不确定如何处理以下情况。有一个接口定义事件处理方法“onSomethinAccounting()”

有一个基类将其作为虚拟方法实现,并在其中使用一些异步代码

有一个派生类要重写虚方法,但也要调用
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),有这个框架,我必须处理它…@Bartosz
async void
是异步操作的一种既定模式,在这种模式中,调用者不想知道操作何时完成,以及是否成功或为什么失败。事件处理程序是存在这种情况的常见情况,但并非所有事件处理程序都处于这种情况,正如并非所有不关心操作何时结束的情况都是事件处理程序一样。如果您想知道方法何时结束,它需要返回一个
任务
,这是
异步
方法固有的。重写事件处理程序或等待它完成也是不寻常的。通常,事件处理程序将彼此独立运行。我也有同样的问题@斯蒂芬·克利里,你能帮忙吗?
public override async void OnSomethingHappening()
        {
           await Task.Run(()=> base.OnSomethingHappening());
            //some more code
        }