是Task.WhenAll报告任务正在完成错误的错误?

时间:2018-02-22 16:26:59

标签: c# async-await task scheduled-tasks delay

使用.Net Framework:4.7.1 期望:   - 模拟在新任务中启动   - 模拟完成后将显示一个消息框。   - 模拟将持续延迟250毫秒,持续30秒。

问题: 任务。等等,直到模拟延迟。将鼠标悬停在模拟任务实例上会将其报告为已完成,即使它没有完成。模拟将继续运行,直到30秒完成,然后任务存在。

这是一个错误吗?

当Task.Delay被注释掉时,它按预期工作。

 public partial class Form1 : Form
{
    private List<Task> m_simulations = new List<Task>();

    public Form1()
    {
        InitializeComponent();
    }

    private async void button1_Click(object sender, EventArgs e)
    {
        m_simulations.Add(
            Task.Run(() =>
              {
                  Simulation simulation = new Simulation();
                  simulation.StartSimulation(new TimeSpan(0, 0, 30));
              })
            );

        await Task.WhenAll(m_simulations);

        MessageBox.Show("Tasks Complete Apparently!!!");
    }
}

public class Simulation
{
    public async void StartSimulation(TimeSpan waitDuration)
    {
        Stopwatch stopwatch = Stopwatch.StartNew();

        while (stopwatch.Elapsed <= waitDuration)
        {
            await Task.Delay(250);
        }
    }
}

1 个答案:

答案 0 :(得分:1)

使用Task.Run你正在创建一个调用StartSimulation方法的任务,但是你永远不会等待模拟完成,所以你await的任务在StartSimulation开始后就结束了,但在它结束之前。

首先,更改StartSimulation以返回Task

public async Task StartSimulation(TimeSpan waitDuration)

然后,不要使用Task.Run,​​只需启动模拟并使用您要等待的事物列表中返回的任务。

    Simulation simulation = new Simulation();
    m_simulations.Add(simulation.StartSimulation(new TimeSpan(0, 0, 30));