首頁 > 後端開發 > 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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板