タスクの順序付けと再入
問題:
タスクが実行できるシナリオを考えてみましょう。同期または非同期で実行できます。前のタスクがまだ保留中に新しいタスクを受信した場合、新しいタスクはキューに入れられ、順番に実行される必要があります。さらに、各タスクの結果は、前のタスクの結果に依存する場合があります。課題は、タスクが連続して複数回実行される可能性がある再入性もサポートしながら、このロジックを実装することです。
解決策:
タスクの連続実行を強制し、再入によるロジックの破壊を防ぐには、Task
変更された AsyncOp
class AsyncOp<T> { Task<T> _pending = Task.FromResult(default(T)); public Task<T> CurrentTask { get { return _pending; } } public Task<T> RunAsync(Func<Task<T>> handler, bool useSynchronizationContext = false) { var pending = _pending; Func<Task<T>> wrapper = async () => { // await the prev task var prevResult = await pending; Console.WriteLine("\nprev task result: " + prevResult); // start and await the handler return await handler(); }; var task = new Task<Task<T>>(wrapper); var inner = task.Unwrap(); _pending = inner; task.RunSynchronously(useSynchronizationContext ? TaskScheduler.FromCurrentSynchronizationContext() : TaskScheduler.Current); return inner; } }
この変更された AsyncOp クラスを使用することにより、逐次タスクの実行と再入が保証されます。変更されたコードは、目的の出力を生成します:
Test #1... prev task result: 0 this task arg: 1000 prev task result: 1000 this task arg: 900 prev task result: 900 this task arg: 800 Press any key to continue to test #2... prev task result: 800 this task arg: 100 prev task result: 100 this task arg: 200
以上が非同期操作でタスクの連続実行と再入性を確保するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。