从基类覆盖async void事件处理程序方法

时间:2017-09-05 15:47:28

标签: c# inheritance async-await

我不知道如何处理以下情况。有一个界面定义了一个事件处理方法' OnSomethinHappening()'。

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

有一个派生类想要覆盖虚方法,但也调用base.OnSomethingHappening()

 public interface ISomething
    {
        void OnSomethingHappening();
    }

    public class BaseClass
    {
        public virtual async void OnSomethingHappening()
        {
            await Task.Delay(1999);
        }
    }

    public class DerivedClass : BaseClass
    {
        public override void OnSomethingHappening()
        {
            base.OnSomethingHappening();
            //some more code
        }
    }

问题是,我无法将方法调用标记为等待,因为它返回void。可以为事件处理程序设置异步void方法,因此不能将其更改为任务(也不是我的代码)。

那么,在进入自己的代码之前,我应该如何确保我的派生类正确执行base.OnSomethingHappening()

这个解决方案在派生类中是否有意义?:

public override async void OnSomethingHappening()
        {
           await Task.Run(()=> base.OnSomethingHappening());
            //some more code
        }

1 个答案:

答案 0 :(得分:5)

  

那么,在进入自己的代码之前,我应该如何确保我的派生类正确执行base.OnSomethingHappening()?

你不是。这就是应该避免使用async void方法的原因。它们没有为调用者提供任何可能的方法来知道操作何时完成,是否成功完成,或者错误是什么,如果有的话。如果您希望能够确保调用者能够知道有关该方法的信息,则需要返回Task,而不是void