在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 ...; }); }