我一直在試圖讓我的頭最近圍繞C#的新的異步/等待和Task.Run功能。在這樣做的時候,我寫了一些簡單的測試代碼寫入控制檯,以便我可以看到事件發生的順序,在這裏和那裏引入Thread.Sleep以確保事情按照我預期的順序發生。Thread.Sleep在Task.Run
這裏是我的測試一個
[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秒後重後我會回來。這不是發生了什麼。我反而得到之前和之後,但從來沒有我會回來。
這是爲什麼?
當我調試它清楚地通過代碼,睡覺和返回。我不需要在任何生產代碼中以這種方式使用Thread.Sleep,但是我想對第二種情況下爲什麼我將不會回寫寫入控制檯。
我測試今天有點懶,所以我只會參考答案。我幾天前寫了一些東西,可以幫助理解TPL + async/await:http://blog.tedd.no/2012/07/28/asyncawait-http-server-in-c/ – 2012-07-31 11:56:18