Thread.Sleep在Task.Run中

时间:2012-07-31 11:35:07

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

我最近试图了解C#的新async / await和Task.Run功能。在这样做的过程中,我编写了一些简单的测试代码,写入控制台,以便我可以看到事情发生的顺序,在这里和那里投入一个Thread.Sleep,以确保事情按照我预期的顺序发生。

这是我的一项测试

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

使用以下Terminator类:

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秒我将回来。这不是发生的事情。我改为之前之后,但从来没有我会回来

这是为什么?

当我调试它时,它清楚地通过代码,睡眠和返回。我不需要在任何生产代码中以这种方式使用Thread.Sleep,但我想模糊地理解为什么我将回来在第二种情况下没有写入控制台。

2 个答案:

答案 0 :(得分:6)

您的测试在尝试打印之前已经完成"我将回来#34;。你没有做任何事情等到那个结束。根据测试运行器的不同,测试完成后,它的重定向Console.WriteLine可能已断开连接。

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

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

答案 1 :(得分:1)

如果您在VS 2012中使用MS Test框架,您也可以像这样编写测试

[TestMethod]
public async Task TaskRun()
{
    Console.WriteLine("Before");
    Task t = Task.Run(() => Console.WriteLine(IWillBeBack()));
    Console.WriteLine("After");
    await t;
}

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