ホームページ > バックエンド開発 > C++ > 非同期操作でタスクの連続実行と再入性を確保するにはどうすればよいですか?

非同期操作でタスクの連続実行と再入性を確保するにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2024-12-30 12:17:10
オリジナル
891 人が閲覧しました

How to Ensure Sequential Task Execution and Re-entrancy in Asynchronous Operations?

タスクの順序付けと再入

問題:

タスクが実行できるシナリオを考えてみましょう。同期または非同期で実行できます。前のタスクがまだ保留中に新しいタスクを受信した場合、新しいタスクはキューに入れられ、順番に実行される必要があります。さらに、各タスクの結果は、前のタスクの結果に依存する場合があります。課題は、タスクが連続して複数回実行される可能性がある再入性もサポートしながら、このロジックを実装することです。

解決策:

タスクの連続実行を強制し、再入によるロジックの破壊を防ぐには、Task を使用してタスクを手動で構築する必要があります。コンストラクターを作成し、後で開始します。 Task.Unwrap() メソッドを使用して、実行される実際のタスクを取得できます。

変更された 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート