작업 순서 지정 및 재진입: 자세한 솔루션
다음 시나리오를 고려하세요.
이 문제를 해결하기 위해 우리는 재처리 개념을 도입합니다. -진입, 중첩된 작업이 실행되는 경우에도 작업 순서가 유지되도록 합니다.
예 코드
// 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; } }
출력
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
이 솔루션을 사용하면 재진입이 도입되어도 원하는 출력을 얻을 수 있습니다.
동기화 및 취소
AsyncOp 클래스는 적절한 메커니즘을 추가하여 동기화 및 취소를 지원하도록 확장할 수 있습니다.
결론
작업 순서 지정 및 재진입을 통해 작업 순서를 유지하고 중첩된 작업을 지원하는 강력한 솔루션을 개발했습니다. 이 패턴은 명령이 비동기적으로 도착하고 이전 명령의 결과에 의존하는 시나리오에서 특히 유용합니다.
위 내용은 비동기 작업에서 순차적 작업 실행을 보장하고 재진입을 처리하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!