[英]Using async/await with Dispatcher.BeginInvoke()
我有一個方法,一些代碼執行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)
的覆蓋形式Dispatcher.Invoke
,它接受一個async void
在該特定情況下的λ。 這可能會導致非常意外的行為,因為它通常發生在async void
方法中 。
你可能正在尋找這樣的東西:
public async Task<int> DoSomethingWithUIAsync()
{
await Task.Delay(100);
this.Title = "Hello!";
return 42;
}
public async Task DoSomething()
{
var x = await Application.Current.Dispatcher.Invoke<Task<int>>(
DoSomethingWithUIAsync);
Debug.Print(x.ToString()); // prints 42
}
在這種情況下, Dispatch.Invoke<Task<int>>
接受Func<Task<int>>
參數並返回相應的Task<int>
,它是等待的。 如果您不需要從DoSomethingWithUIAsync
返回任何內容,只需使用Task
而不是Task<int>
。
或者,使用Dispatcher.InvokeAsync
方法之一。
使用Dispatcher.Invoke()
public async Task DoSomething()
{
App.Current.Dispatcher.Invoke(async () =>
{
var x = await ...;
});
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.