2017-09-05 83 views
2

我不知道如何處理以下情形。有一個接口定義了一個事件處理方法'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 
     } 
    } 

問題是,我不能標記方法調用作爲awaitable,因爲它返回void。可以爲事件處理程序提供異步無效方法,因此無法將其更改爲任務(它也不是我的代碼)。

那麼,我應該如何確保我的派生類在執行自己的代碼之前正確執行base.OnSomethingHappening()

在派生類中是否該解決方案是否合理?:

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

回答

5

所以,我應該如何確保我的派生類中執行base.OnSomethingHappening()將自己的代碼之前,正常嗎?

你不知道。這就是爲什麼應該避免使用async void方法的原因。他們沒有提供任何方式讓調用者知道操作何時完成,是否成功完成,或者錯誤是什麼,如果有的話。如果您希望能夠確保調用者能夠知道有關該方法的信息,則需要返回Task而不是void

+0

對,但不是'async void'事件處理程序建立的模式?在任何情況下,這不是我的代碼,但一個相當完善的框架(棱鏡),有這個,我必須應付它... – Bartosz

+0

@Bartosz異步無效是一種建立模式的異步操作,其中調用者無意知道操作何時完成,以及它是成功還是不成功。事件處理程序是存在這種情況的常見情形,但並非所有*事件處理程序都處於這種情況,就像並非所有您不關心操作何時結束的情況都是事件處理程序一樣。如果你想知道方法何時結束,它需要返回一個'Task',這只是'async'方法固有的。 – Servy

+0

覆蓋事件處理程序或等待它完成也很少見。通常,事件處理程序將獨立運行。 – libertyernie