2011-03-16 5 views
1

이 작업을 수행하는 방법이 궁금합니다. 나는 오랜 시간이 걸리는 COM 객체를 가지고 있는데, 뭔가 잘못되면 20 분이 지났음을 알았다. 클라이언트 프로그램이 너무 오래 기다리는 것은 용납 될 수없는 일입니다.COM Interop에 시간 초과가 발생했습니다.

따라서 다른 스레드에서 COM 작업을 호출하고 특정 시간 초과 후에 스레드를 죽일 생각입니다.

나는 동기 반사를 통해 invokation을 할 수있는 COM 도우미가 있습니다

ComInvoke.Get<bool>(dcomSrv, "Launched"); 

이 COM 인스턴스

에서 부울 속성을 얻고 난이 사용하여 작업을 마무리 할 :

var task = Task.Factory.StartNew<bool>(() => 
      { 
       return ComInvoke.Get<bool>(dcomSrv, "Launched"); 
      }); 

if (task.Wait(5000) == false) 
      { 
       task.Dispose(); 
       throw new Exception("Task timeout"); 
      } 

문제는 취소 토큰을 사용할 수있는 루프가 없다는 것입니다.

좋은 해결책인가요? 아니면 더 좋은 점이 있습니까?

감사합니다. TPL이 일의 일정 기본적으로 ThreadPool이를 사용하기 때문에

+0

in-process COM 개체 또는 원격 DCOM 개체 ('dcomSrv'라는 이름이 불안한 단서입니까?)입니까? –

+0

DCOM 개체 (에이전트 종류)이거나 로컬 또는 원격 컴퓨터에서 실행될 수 있습니다. – Robert

답변

2

Task::Dispose 사실이 논리는 DCOM 개체를 차단하는 전체 20 분 동안 스레드 풀 스레드를 소모합니다,의 Task의 기본 스레드를 중지하지 않습니다. 사실 TaskDispose을 호출하면 예외가 발생할 것이라고 확신합니다.

TPL을 사용하면 안되며 원하는 시간 내에 완료되지 않으면 자신의 Thread 인스턴스를 스핀 업하려는 경우 일 뿐이며 Abort 만 입력하면됩니다.

+0

답변 주셔서 감사 드리며,이 방법으로 테스트를 마쳤습니다. – Robert

관련 문제