之所以收到该错误,是因为Task
该类在将任务提供给您之前已经启动了任务。您应该只Start
通过调用其构造函数来调用所创建的任务,除非您有充分的理由在创建任务时不启动该任务,否则甚至不应这样做。如果您希望它立即启动,则应该使用Task.Run
或Task.Factory.StartNew
来创建和启动新的Task
。
所以,现在我们知道要摆脱那讨厌的事Start
。您将运行代码,发现消息框立即显示,而不是5秒后显示,这是怎么回事?
好吧,Task.Delay
只给您一个任务,它将在5秒钟内完成。它不会在5秒钟内停止执行线程。您要做的是在任务完成后执行一些代码。那ContinueWith
是为了什么 它使您可以在完成给定任务后运行一些代码:
public void FunctionA()
{
Task.Delay(5000)
.ContinueWith(t =>
{
MessageBox.Show("Waiting Complete");
});
}
这将按预期方式运行。
我们还可以利用C#5.0的await
关键字来更轻松地添加延续:
public async Task FunctionA()
{
await Task.Delay(5000);
MessageBox.Show("Waiting Complete");
}
尽管这里发生的事情的完整解释超出了此问题的范围,但最终结果是一种方法的行为与先前的方法非常相似。调用该方法5秒钟后,它将显示一个消息框,但是在两种情况下,方法本身都会[几乎]返回。也就是说,await
它非常强大,并且允许我们编写看似简单明了的方法,但是ContinueWith
直接使用它们编写起来会更加困难和混乱。它也大大简化了错误处理,节省了大量样板代码。
Wait()
任务将阻塞当前线程,直到任务解决。那几乎永远不会是您想要发生的事情。