どうすればいいのかしら?どのようなシナリオでこの方法を使用できますか。
私の最初の考えはRunSynchronously
、非同期メソッドを呼び出して、そのようなデッドロックの問題を引き起こすことなく同期的に実行すること.wait()
です。
ただし、MSDNによると、
通常、タスクはスレッドプールスレッドで非同期に実行され、呼び出し元のスレッドをブロックしません。RunSynchronously()メソッドを呼び出すことによって実行されるタスクは、現在のTaskSchedulerに関連付けられ、呼び出し元のスレッドで実行されます。ターゲットスケジューラが呼び出しスレッドでのこのタスクの実行をサポートしていない場合、タスクはスケジュールどおりに実行されるようにスケジュールされ、呼び出しスレッドはタスクの実行が完了するまでブロックされます。
タスクが呼び出し元のスレッドで実行される場合、なぜここにTaskSchedulerが必要なのですか?
RunSynchronously
タスクをいつ開始するかの決定を現在のタスクスケジューラ(または引数として渡されたもの)に委任します。
なぜそこにあるのか(おそらく内部またはレガシーで使用するため)はわかりませんが、現在のバージョンの.NETで役立つユースケースを考えるのは難しいです。@Fabjanは、質問に対する彼のコメントで考えられる説明をしています。
RunSynchronously
スケジューラーに同期的に実行するように要求しますが、スケジューラーはヒントを無視してスレッドプールスレッドで実行することができ、現在のスレッドは完了するまで同期的にブロックします。
スケジューラーは、現在のスレッドで実行する必要はなく、すぐに実行する必要もありませんが、一般的なスケジューラー(ThreadPoolTaskSchedulerおよび一般的なUIスケジューラー)で発生すると思います。
RunSynchronously
タスクがすでに開始されているか、完了/障害が発生した場合にも例外がスローされます(これは、非同期メソッドでタスクを使用できないことを意味します)。
このコードは、さまざまな動作を明確にする場合があります。
Wait
そしてResult
すべてのタスクを実行しない、彼らは現在のスレッドのタスクの完了を待って、我々は比較したい場合は、私たちが比較できるように完了するまで、それをブロックStart
してWait
にRunSynchronously
:
class Scheduler : TaskScheduler
{
protected override void QueueTask(Task task) =>
Console.WriteLine("QueueTask");
protected override bool TryExecuteTaskInline(Task task, bool taskWasPreviouslyQueued)
{
Console.WriteLine("TryExecuteTaskInline");
return false;
}
protected override IEnumerable<Task> GetScheduledTasks() => throw new NotImplementedException();
}
static class Program
{
static void Main()
{
var taskToStart = new Task(() => { });
var taskToRunSynchronously = new Task(() => { });
taskToStart.Start(new Scheduler());
taskToRunSynchronously.RunSynchronously(new Scheduler());
}
}
StartまたはRunSynchronously
コードを実行してコメントStart
しようとすると、タスクをスケジューラーにキューに入れようとしますが、RunSynchronously
インラインで実行しようとします。失敗した場合(falseを返す)、キューに入れられます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加