最近我一直在试图理解C#的新异步/等待和Task.Run功能。为此,我编写了一些简单的测试代码,将结果写入控制台,以便我可以看到事情发生的顺序,并在这里和那里加入Thread.Sleep来确保事情按照我的预期顺序真正发生。
以下是我的其中一个测试:
[Test]
public void TaskRun()
{
Console.WriteLine("Before");
Task.Run(() => Console.WriteLine(_terminator.IWillBeBack()));
Console.WriteLine("After");
}
使用以下终止器类:
public class Terminator
{
public string IWillBeBack()
{
return "I will be back";
}
}
我预计的结果是Before、After,接着是I will be back。实际上也正是如此。然后我对IWillBeBack方法进行了更改,使其可以休眠3秒钟。代码如下:
public class Terminator
{
public string IWillBeBack()
{
Thread.Sleep(3000);
return "I will be back";
}
}
我本来期望的结果应该是先显示Before, 然后是After,最后在3秒后再次显示I will be back。但事实并非如此。实际上,我只看到了Before和After,却从未看到过I will be back。
这是为什么呢?
当我进行调试时,代码显然已经执行完毕并返回。在任何生产代码中,我都不需要像这样使用Thread.Sleep,但我想大概了解为什么第二种情况下没有将I will be back写入控制台。