带有'Task.Factory.StartNew'的异步wpf事件不会等待等待

时间:2016-10-31 08:52:16

标签: c# .net wpf async-await

以下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()函数,但在更复杂的情况下会导致死锁。
  3. 注意:这是一个简化的示例。我的真实世界代码我正在调用一系列异步方法,所有都返回Task对象,所有都在等待,但它们仍然没有按照我需要的顺序运行。函数Task.Factory.StartNew()以完全相同的方式用于我的真实代码。

1 个答案:

答案 0 :(得分:4)

a few reasons you shouldn't use Task.Factory.StartNew,但其中一个是没有超载接受Func<Task>Func<Task<T>>

因为它不“理解”异步委托,所以它会在委托的初始同步部分完成后立即返回 - 即在它遇到第一个await时立即返回,在这种情况下。

您应该使用Task.Run代替。