TPL &の違いを理解しようとすると、スレッド作成に関するasync/awaitが発生します。TPLとasync/await(スレッド処理)の違い
TPL(TaskFactory.Startnew)は、ThreadPool.QueueUserWorkItemと同様に動作し、スレッドプール内のスレッドに作業をキューイングすると考えています。これはもちろん、新しいスレッドを作成するTaskCreationOptions.LongRunningを使用しない限りです。私は非同期/のawait考え
ので、本質的に同じように動作します:
TPL:
Factory.StartNew(() => DoSomeAsyncWork())
.ContinueWith(
(antecedent) => {
DoSomeWorkAfter();
},TaskScheduler.FromCurrentSynchronizationContext());
非同期/待つ:
await DoSomeAsyncWork();
DoSomeWorkAfter();
は同一です。私が読んでいたことから、非同期/唯一の「時々」が新しいスレッドを作成するのを待っているようです。では、いつ新しいスレッドを作成し、新しいスレッドを作成しないのですか? IO完了ポートを扱っていたら、新しいスレッドを作成する必要がないことがわかりますが、それ以外の場合はそれが必要であると思います。私は、FromCurrentSynchronizationContextについての私の理解は、常に少しでもあいまいだったと思います。私は本当に、本質的に、UIスレッドでした。
実際、TaskCreationOptions.LongRunningは「新しいスレッド」を保証するものではありません。 MSDNでは、* "LongRunning"オプションはスケジューラにヒントを提供します。 *専用スレッドを保証するものではありません。 – eduncan911
@ eduncan911あなたが書いていることは間違いありませんが、私はTPLのソースコードをしばらく前に調べました。実際には、 'TaskCreationOptions.LongRunning'が指定されたときに常に新しい専用スレッドが作成されています。 –
@ZaidMasud:もう一度見たいかもしれません。'Thread.CurrentThread.IsThreadPoolThread'が数百ミリ秒の短期間のスレッドでtrueを返すため、スレッドをプールしていたことが分かります。私が複数のスレッドに出血を使用していたThreadStatic変数はもちろん、すべての種類の怪物を引き起こしていました。私は専用のスレッドを保証するために、自分のコードを古いスレッドの方法である複数のThread()を新しくするように強制しなければなりませんでした。言い換えれば、私はTaskFactoryを専用のスレッドに使用できませんでした。必要に応じて、専用スレッドを常に返す独自の 'TaskScheduler'を実装することもできます。 – eduncan911