在Dispatcher.BeginInvoke()中使用async / await

我有一个方法与一些代码执行await操作:

 public async Task DoSomething() { var x = await ...; } 

我需要在Dispatcher线程上运行该代码。 现在, Dispatcher.BeginInvoke()是等待的,但是我无法将lambda标记为async以便从内部运行await ,如下所示:

 public async Task DoSomething() { App.Current.Dispatcher.BeginInvoke(async () => { var x = await ...; } ); } 

在内部async ,我得到错误:

无法将lambda表达式转换为类型’System.Delegate’,因为它不是委托类型。

如何在Dispatcher.BeginInvoke()使用async

另一个答案可能引入了一个模糊的错误。 这段代码:

 public async Task DoSomething() { App.Current.Dispatcher.Invoke(async () => { var x = await ...; }); } 

使用Dispatcher.Invoke(Action callback)覆盖forms,它在这种特殊情况下接受async void lambda。 这可能会导致非常意外的行为,因为它通常发生在async void方法中 。

你可能正在寻找这样的东西:

 public async Task DoSomethingWithUIAsync() { await Task.Delay(100); this.Title = "Hello!"; return 42; } public async Task DoSomething() { var x = await Application.Current.Dispatcher.Invoke>( DoSomethingWithUIAsync); Debug.Print(x.ToString()); // prints 42 } 

在这种情况下, Dispatch.Invoke>接受Func>参数并返回相应的Task ,它是等待的。 如果您不需要从DoSomethingWithUIAsync返回任何内容,只需使用Task而不是Task

或者,使用Dispatcher.InvokeAsync方法之一。

使用Dispatcher.Invoke()

 public async Task DoSomething() { App.Current.Dispatcher.Invoke(async () => { var x = await ...; }); }