我知道TPL是面向任務的,而傳統的線程模型是面向工作者的。 任務讓你主要關注你想要解決什麼問題,而不是如何使用 來完成。但是當涉及到線程和任務關係時,我仍然有點困惑。如何確定使用TPL時將執行哪個線程?
下面是一個演示代碼:
namespace AsyncUnderTheHood
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Main Start : {0}", Thread.CurrentThread.ManagedThreadId);
AwaitTest();
Console.WriteLine("Main End : {0}", Thread.CurrentThread.ManagedThreadId);
Console.ReadLine();
}
public static void DoWork()
{
Console.WriteLine("DoWork Start: {0}", Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(5000);
Console.WriteLine("DoWork End: {0}", Thread.CurrentThread.ManagedThreadId);
}
public async static void AwaitTest()
{
Console.WriteLine("AwaitTest Start : {0}", Thread.CurrentThread.ManagedThreadId);
Task t = new Task(DoWork);
t.Start();
await t;
Console.WriteLine("AwaitTest Done : {0}", Thread.CurrentThread.ManagedThreadId);
}
}
}
輸出是這樣的:
Main Start : 1
AwaitTest Start : 1 <------------ A
DoWork Start: 3
Main End : 1
DoWork End: 3
AwaitTest Done : 3 <------------ B
我的問題是,爲什麼A和B是在不同的線程?
相同的方法在不同的線程上執行,當線程親和性很重要時,這會導致問題嗎?
您正在控制檯應用程序中使用異步無效方法..是真的好嗎? – 2013-04-07 16:33:16
@WouterdeKort正如你從輸出中看到的那樣,它可以工作(因爲'ReadLine()'。雖然這是一種不好的做法,不應該在生產代碼中完成。 – svick 2013-04-07 16:35:04
@WouterdeKort這是「工作」,因爲如果main沒有讓應用程序像這樣運行,你永遠無法「等待」async void方法,應用程序可能在任務開始之前退出,不建議使用async void事件處理函數以外的任何其他方法 – 2013-04-07 16:37:19