使用.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);
}
}
}
答案 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));