如何从 WPF HwndSource 钩子异步调用方法?
How to call methods asynchronously from WPF HwndSource hook?
根据 中的说明,我已经为我的 WPF 应用程序注册了一个全局热键,如下所示:
this.helper = new WindowInteropHelper(this);
this.source = HwndSource.FromHwnd(this.helper.Handle);
this.source.AddHook(this.HwndHook);
我想从热键处理程序进行异步调用,以避免挂起 UI 线程并逐步更新 window,例如:
private async Task OnHotKeyPressed()
{
this.MyText = "Loading...";
this.MyText = await CallRestApi();
}
不幸的是,我不知道该怎么做。 AddHook 方法没有异步方法的重载,如果我将我的处理程序包装在 .Result 或 AsyncContext.Run(...) 中,则 UI 不会更新,直到整个方法的完毕。有任何想法吗?谢谢!
The AddHook method doesn't have an overload for async methods ...
不,它没有,对此您无能为力,即您无法更改同步 API。
但是由于 hook
参数表示将接收所有 window 消息的事件处理程序,您仍然可以像现在这样异步地 实现 事件处理程序已经在做:
private async void OnHotKeyPressed() { ... }
如前所述,一般准则是避免使用 return 和 void
的 async
方法,但不能 return 任何其他方法的事件处理程序除外。换句话说,在事件处理程序中使用 async
和 await
关键字是完全没问题的。
根据 中的说明,我已经为我的 WPF 应用程序注册了一个全局热键,如下所示:
this.helper = new WindowInteropHelper(this);
this.source = HwndSource.FromHwnd(this.helper.Handle);
this.source.AddHook(this.HwndHook);
我想从热键处理程序进行异步调用,以避免挂起 UI 线程并逐步更新 window,例如:
private async Task OnHotKeyPressed()
{
this.MyText = "Loading...";
this.MyText = await CallRestApi();
}
不幸的是,我不知道该怎么做。 AddHook 方法没有异步方法的重载,如果我将我的处理程序包装在 .Result 或 AsyncContext.Run(...) 中,则 UI 不会更新,直到整个方法的完毕。有任何想法吗?谢谢!
The AddHook method doesn't have an overload for async methods ...
不,它没有,对此您无能为力,即您无法更改同步 API。
但是由于 hook
参数表示将接收所有 window 消息的事件处理程序,您仍然可以像现在这样异步地 实现 事件处理程序已经在做:
private async void OnHotKeyPressed() { ... }
如前所述,一般准则是避免使用 return 和 void
的 async
方法,但不能 return 任何其他方法的事件处理程序除外。换句话说,在事件处理程序中使用 async
和 await
关键字是完全没问题的。