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
}
對,但不是'async void'事件處理程序建立的模式?在任何情況下,這不是我的代碼,但一個相當完善的框架(棱鏡),有這個,我必須應付它... – Bartosz
@Bartosz異步無效是一種建立模式的異步操作,其中調用者無意知道操作何時完成,以及它是成功還是不成功。事件處理程序是存在這種情況的常見情形,但並非所有*事件處理程序都處於這種情況,就像並非所有您不關心操作何時結束的情況都是事件處理程序一樣。如果你想知道方法何時結束,它需要返回一個'Task',這只是'async'方法固有的。 – Servy
覆蓋事件處理程序或等待它完成也很少見。通常,事件處理程序將獨立運行。 – libertyernie