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 が別のスレッドにあるのですか?
同じメソッドが異なるスレッドで実行されますが、スレッド アフィニティが重要な場合に問題が発生しますか?