[英]How to use Thread.Sleep with Task.Run without blocking main tread
[英]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.