代码之家  ›  专栏  ›  技术社区  ›  Fabien

是任务。什么时候会报告错误完成的任务?

  •  0
  • Fabien  · 技术社区  · 7 年前

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

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

    这是虫子吗?

    当任务。延迟被注释掉,它按预期工作。

     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 回复  |  直到 7 年前
        1
  •  1
  •   StriplingWarrior    7 年前

    通过使用 Task.Run 您正在创建一个任务来调用StartSimulation方法,但您从不等待模拟完成,因此您需要 await ing在开始模拟后结束,但在模拟完成之前结束。

    首先,更改StartSimulation以返回 Task :

    public async Task StartSimulation(TimeSpan waitDuration)
    

    然后,而不是使用任务。运行时,只需启动模拟,并在要等待的事情列表中使用返回的任务。

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