【问题标题】:Async wpf event with 'Task.Factory.StartNew' does not wait for await带有“Task.Factory.StartNew”的异步 wpf 事件不等待等待
【发布时间】:2017-03-13 08:20:26
【问题描述】:

下面的click button event首先用“B”填充list,然后用“A”。

List<string> list = new List<string>();

private async void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
    await Task.Factory.StartNew(async () =>
    {
        await Task.Factory.StartNew(() => Thread.Sleep(1000));

        list.Add("A");
    });

    list.Add("B");
}

问:如何使用 await async 概念强制 .Add("A") 在 .Add("B") 之前执行?

我试过了:

  1. 我尝试将void 替换为Task,但无法将函数分配给Click 事件。
  2. 我尝试了 Task.Wait() 函数,但在稍微复杂一点的情况下,它会导致死锁。

注意:这是一个简化的示例。在我的真实世界代码中,我正在调用一系列异步方法,所有方法都返回Task 对象并且都在等待,但它们仍然没有按我需要的顺序运行。 Task.Factory.StartNew() 函数在我的真实代码中的使用方式完全相同。

【问题讨论】:

    标签: c# .net wpf async-await


    【解决方案1】:

    a few reasons you shouldn't use Task.Factory.StartNew,但其中之一是没有接受Func&lt;Task&gt;Func&lt;Task&lt;T&gt;&gt; 的重载。

    由于它不“理解”异步委托,它会在委托的初始同步部分完成后立即返回 - 即,在这种情况下,只要它到达第一个 await

    您应该改用Task.Run

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-07
      • 2016-03-25
      • 2017-10-09
      • 2017-12-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多