根据https://stackoverflow.com/a/11378213/892770,我已经为我的WPF应用程序注册了一个全局热键,如下所示:
this.helper = new WindowInteropHelper(this);
this.source = HwndSource.FromHwnd(this.helper.Handle);
this.source.AddHook(this.HwndHook);
我想从热键处理程序进行异步调用,以避免挂起UI线程并逐段更新窗口,例如:
private async Task OnHotKeyPressed()
{
this.MyText = "Loading...";
this.MyText = await CallRestApi();
}
不幸的是,我不知道该怎么做。AddHook方法没有用于异步方法的重载,如果我将处理程序包装在.Result或AsyncContext.Run(…(中,则在整个方法完成之前,UI不会得到更新。有什么想法吗?谢谢
AddHook方法没有异步方法的重载。。。
不,它没有,对此你无能为力,即你不能更改同步API。
但是,由于hook
参数表示一个将接收所有窗口消息的事件处理程序,因此您仍然可以异步实现事件处理程序
private async void OnHotKeyPressed() { ... }
如前所述,一般准则是避免使用返回void
的async
方法,但不能返回任何其他内容的事件处理程序除外。换句话说,在事件处理程序中使用async
和await
关键字是完全可以的。