캡핑 된 버퍼 된 작업 실행 프로그램을 구현하고 싶습니다.캡핑되고 버퍼 된 작업 실행 프로그램 구현
는 단일 메소드를 갖
public class CappedBufferedExecutor {
public CappedBufferedExecutor(int bufferCapping, int fillTimeInMillisec);
public Task<bool> EnqueueAsync(string val);
}
아이디어 값 비동기 대기열되어 있으며, fillTimeInMillisec
밀리 통과 또는 버퍼 고유 값의 캡에 충전되면, 실행은 실제로 완료되고 비동기 작업이 모두 완료됩니다. 실행이 완료되면 (오랜 시간이 소요될 수 있음) 버퍼를 다시 채울 수 있고 새로운 비동기 실행을 수행 할 수 있습니다.
은 내가 fillTime
가 한 번 경과, 통과 새 작업을 만들 때까지 기다려야하는 Timer
를 사용하여 다음 의사 코드
- 의 라인에 뭔가 생각, 일을 할 것이다 (아래 참조) .
- 새 값으로 읽으려면
rwlock
을 잠급니다. 버퍼가 가득 차 있는지 확인하십시오 (ManualResetEvent
또는TaskCompletionSource
). - 버퍼에 새로운 값을 추가하십시오 (
HashSet<string>
). - 버퍼가 꽉 찬 경우
rwlock
을 쓰기 위해 잠그는 새 실행 작업을 만들고 모든 수집 된 값에 대해 작업을 수행하고TaskCompletionSource
을 사용하여 모든 보류중인 작업을 다시 시작하십시오. TaskCompletionSource
에서 버퍼 된 작업 (이전 단계에서 언급 했음)이 실행될 때까지 기다립니다.
내 문제 다음 Timer
및 채워진 버퍼 검사를 동기화하는 방법은, 대기하는 버퍼가 가득 찼을 때, 실행을 시작하고 새 값이 도착 할 수 있도록 할 때 TaskCompletionSource
인스턴스 사이를 전환하는 방법에 대해 설명합니다.
:-) 많은 것을 기대하지 않습니다 왜 당신이 EnqueueAsync''에서'작업'반환해야합니까? 버퍼가 꽉 찼을 때 작업 목록만으로 이벤트를 발생시킬 수 있습니까? –
apocalypse
항목이 아직 처리되고 버퍼가 완료되기 전에 가득 차 있다면 어떻게해야합니까? –
@apocalypse bool은 작업이 성공적으로 수행되었음을 나타냅니다. 중요하지 않은, 당신의 길을 갈 수 있습니다. – Mugen