작업 순서 지정 및 재입력
문제:
작업이 다음과 같은 시나리오를 고려합니다. 동기식 또는 비동기식으로 실행됩니다. 이전 작업이 보류 중인 동안 새 작업이 수신되면 새 작업이 대기열에 추가되어 순차적으로 실행되어야 합니다. 또한 각 작업의 결과는 이전 작업의 결과에 따라 달라질 수 있습니다. 문제는 작업이 여러 번 연속적으로 실행될 수 있는 재진입을 지원하는 동시에 이 논리를 구현하는 것입니다.
해결책:
순차 작업 실행을 시행하고 재진입으로 인해 로직이 중단되는 것을 방지하려면 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!