gpt4 book ai didi

c# - DispatcherOperation.Task 立即返回

转载 作者:太空宇宙 更新时间:2023-11-03 23:19:47 25 4
gpt4 key购买 nike

我有一个 WPF 应用程序,我在其中按下一个按钮并执行以下代码:

private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
new Thread(
async () =>
{
Action lambda = async () =>
{
await Task.Delay(5000);
MessageBox.Show("Lambda done");
};
await this.Dispatcher.BeginInvoke(DispatcherPriority.Normal, lambda).Task;
MessageBox.Show("Dispatch done");
}).Start();
}

MSDN documentationDispatcherOperation.Task说:Gets a Task<TResult> that represents the current operation. (这不是 Task<TResult> :/)
所以我认为等待这意味着 MessageBox.Show("Dispatch done");只会在 lambda 完成后执行。然而,事实并非如此。按下按钮后立即显示带有“Dispatch done”文本的 MessageBox,如预期的那样,5 秒后显示带有“Lambda done”文本的 MessageBox。

有人能解释一下吗?我不明白为什么会这样。

最佳答案

这一行:

Action lambda = async ...

正在创建 async void lambda 而不是 async Task lambda 。 async void 的(许多)问题之一是没有(简单的)方法来判断它何时完成。为此,"avoid async void" is one of the best practices在我关于该主题的 MSDN 文章中。

我没试过,但我怀疑 Dispatcher.BeginInvoke只能取Action代表(而不是更异步友好的 Func<Task> ),在这种情况下使用 Dispatcher.Invoke 可能更好并传递 Func<Task> .不过,在我自己的代码中,我避免使用 Dispatcher完全;我发现它鼓励更糟糕的代码。而不是 Dispatcher , 考虑使用 await和/或 Progress<T> .

关于c# - DispatcherOperation.Task 立即返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35796877/

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