次のコードを検討してください
async Task<int> foo()
{
await Task.Delay(1000);
return 42;
}
...
// OPTION 1
Task t = Task.Factory.StartNew(foo,
CancellationToken.None, TaskCreationOptions.DenyChildAttach, TaskScheduler.Default);
t.Wait();
...
// OPTION 2
Task t = foo();
t.Wait()
質問
2つの呼び出しオプションの実質的な違いは何ですか?
オプション1で。デフォルトのTaskSchedulerをオーバーライドするとします。fooメソッドで待機する場合-どのTaskSchedulerが使用されますか?デフォルトを使用しますか、それとも親タスクにパラメーターで渡されたものを使用しますか?
ただし、一般的に、「オプション1」は、への呼び出しをラップする新しいタスクを作成しfoo()
、効果的にを作成しTask<Task<int>>
ます。それを呼び出すと.Wait()
、内部タスクがほぼ即座に(Task.Delay
がヒットするとすぐに)戻るため、内部タスクが完了するのを待つことはありません。
デフォルト以外の使用に関する質問についてTaskScheduler
は、カスタムスケジューラがタスクを開始するまでブロックされる可能性があるという事実を除いて、通常、動作は変更されません。問題のスケジューラに関する詳細情報がなければ、何が起こるかを正確に知ることは不可能です。
ただし、2番目のオプションは、タスクを開始するため、遅延が完了するまでブロックし、遅延が完了するまでブロックします。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加