任務排序和重入
問題:
可以考慮一個場景,其中任務可以考慮一個場景,其中任務可以同步或異步執行。如果在前一個任務仍處於待處理狀態時接收到新任務,則新任務應排隊並依序執行。此外,每個任務的結果可能取決於前一個任務的結果。挑戰在於實現此邏輯的同時也支援可重入,其中任務可能會連續執行多次。
解決方案:
強制順序執行任務並為了防止由於重入而破壞邏輯,需要使用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中文網其他相關文章!