C#使用异步委托的两种方式,这里的特委托以EventHandlers为例。
public class MyView
{
public EventHandler OnRefreshObjectExplorerClicked;
}
添加事件如下:
MyView view = new MyView();
view.OnRefreshObjectExplorerClicked += new EventHandler(async (s, e) => await RefreshObjectExplorerAsync());
或者更简单明了的写法如下:
view.OnRefreshObjectExplorerClicked += async (s, e) => await RefreshObjectExplorerAsync();
要点说明
- async void 只适用于事件处理器,异常无法被外部捕获,其它场景应返回 Task。
- 事件订阅可直接用 lambda:view.OnRefresh += async (s, e) => await RefreshAsync();
- EventHandler 的签名返回 void,因此 lambda 中只能写 async void(属于允许的例外)。
- 如需等待完成,改用自定义委托 Task MyHandler(...),并显式 await。