gpt4 book ai didi

c# - 将异步/等待与 Dispatcher.BeginInvoke() 结合使用

转载 作者:IT王子 更新时间:2023-10-29 04:21:17 26 4
gpt4 key购买 nike

我有一个方法,其中包含一些执行 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 中,我得到错误:

Cannot convert lambda expression to type 'System.Delegate' because it is not a delegate type.

如何在 Dispatcher.BeginInvoke() 中使用 async

最佳答案

other answer可能引入了一个不起眼的错误。这段代码:

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

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

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

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 之一方法。

关于c# - 将异步/等待与 Dispatcher.BeginInvoke() 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23442543/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com