如何从WPF-HwndSource钩子异步调用方法



根据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() { ... }

如前所述,一般准则是避免使用返回voidasync方法,但不能返回任何其他内容的事件处理程序除外。换句话说,在事件处理程序中使用asyncawait关键字是完全可以的。

最新更新