簡體   English   中英

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

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM