簡體   English   中英

Thread.Sleep在Task.Run中

[英]Thread.Sleep in Task.Run

我最近試圖了解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以這種方式在任何生產代碼,但我想有,為什么我會回來的一個模糊的認識不寫入在第二種情況下,控制台。

您的測試在嘗試打印“我將回來”之前完成。 你沒有做任何事情等到那個結束。 根據測試運行器的不同,它會重定向Console.WriteLine可能在測試完成后立即斷開連接。

如果您想看到它完成,請將您的測試更改為:

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

如果您在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";
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM