문제

CCR을 사용하는 프로젝트에서 작업 실행에 대한 타임 아웃을 구현하고 싶습니다. 기본적으로 항목을 포트에 게시하거나 DispatcherQueue에 작업을 흡수 할 때 구성된 시간보다 오래 걸리면 실행중인 작업이나 스레드를 중단 할 수 있기를 원합니다. 어떻게 할 수 있습니까?

도움이 되었습니까?

해결책

당신이 요구하는 것을 확인할 수 있습니까? 디스패처에서 오래 지속되는 작업을 수행하고 있습니까? 스레드를 죽이면 CCR 모델이 깨질 것이므로 스레드에 신호를 보내고 작업을 마치고 수확량을 마칠 수 있어야합니다. 충분히 빨리 마무리되지 않는 루프라고 가정하면 타이머를 흡수하도록 선택할 수 있습니다.

var resultTimeoutPort = new Port<DateTime>();
dispatcherQueue.EnqueueTimer(TimeSpan.FromSeconds(RESULT_TIMEOUT), 
                             resultTimeoutPort);

차단 스레드가 ResultTimeOutport에 대한 참조를 사용할 수 있는지 확인하십시오. 차단 루프에서 출구 조건 중 하나는 다음과 같습니다.

do
{
    //foomungus amount of work
}while(resultTimeoutPort.Test()==null&&
       someOtherCondition)

내가 잘못된 나무를 짖고 있다면 더 많은 정보를 게시하십시오.

다른 팁

CCR "수신"핸들러 (또는 대의원을 통해 메소드를 호출하는 메소드)의 시작 부분에서 스레드 (Thread.CurrentThread)를 등록 할 수 있습니다. 그런 다음 정기적 인 점검을 수행하고 필요한 경우 기본적으로 스레드를 수동으로 만든 경우 수행 한 것과 동일한 방식으로 중단 할 수 있습니다. 캐치는 고정 된 수의 스레드와 함께 자신의 Microsoft.ccr.core.dispatcher를 사용하는 경우, 일단 스레드를 중단하면 (내 테스트를 기반으로) 스레드를 되 찾을 수있는 방법이 없다고 생각합니다. 따라서 디스패처에 5 개의 스레드가있는 경우 게시 된 작업에 관계없이 게시하기 전에 5 번만 중단 할 수 있습니다. 그러나 CLR 스레드 풀을 사용하여 Dispatcherqueue를 구축하면 CCR 스레드가 자동으로 교체되며 해당 문제가 없습니다. CCR 디스패처를 권장하지만 CCR 스레드 풀을 사용하는 것이이 상황에서 갈 수있는 방법이라고 생각합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top