c# - Task.Run 中的 Thread.Sleep

标签 c# .net task-parallel-library async-await c#-5.0

我最近一直在努力了解 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";
    }
}

由此我预计结果很可能是之前之后,然后我会回来。这确实发生了。然后我对 IWillBeBack 方法进行更改,使其休眠 3 秒。代码:

public class Terminator
{
    public string IWillBeBack()
    {
        Thread.Sleep(3000);
        return "I will be back";
    }
}

我预计结果仍然是之前之后,然后又是 3 秒后 我会回来。但这不是发生的事情。我取而代之的是 BeforeAfter,但永远不会 I will be back

这是为什么?

当我调试时,它清楚地遍历代码、休眠和返回。我不需要在任何生产代码中以这种方式使用 Thread.Sleep,但我想对为什么 I will be back 在第二种情况下没有写入控制台有一个模糊的理解。

最佳答案

在尝试打印“I will be back”之前,您的测试已完成。在完成之前,您不会做任何事情。根据测试运行器的不同,它正在重定向 Console.WriteLine 可能在测试完成后立即断开连接。

如果您想看到它完成,请将您的测试更改为:

[Test]
public void TaskRun()
{
    Console.WriteLine("Before");
    var task = Task.Run(() => Console.WriteLine(_terminator.IWillBeBack()));
    Console.WriteLine("After");
    task.Wait();
}

关于c# - Task.Run 中的 Thread.Sleep,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11739195/

相关文章:

c# - 为什么表达式树不能包含命名参数规范?

c# - 什么是 WebResource.axd?

c# - 将网页导出为 pdf 时从代码隐藏进行自定义

c# - 这是正确的实现吗?

c# - 并行处理一个密集的IO函数

c# - 任务并行库异常句柄 "A task was canceled."

c# - MigraDoc - 叠瓦/嵌套表格?

c# - 为什么 "\n"在 Windows 上换行?

c# - 用年份格式化 TimeSpan

c# - 默认文件名 SaveFileDialog