2017-12-07 2 views
-1

"RequestMessage()"라는 비동기 메서드가 있습니다. 이 방법에서 메시지 브로커에게 메시지를 보냅니다. 결과가 언제 나올지 몰라 "TaskCompletionSource"를 사용하고 있습니다. 응답 메시지가 도착했을 때 비동기 메서드를 종료해야합니다 (브로커에서 이벤트를 받겠습니다).비동기 메서드에서 시간 초과

이것은 지금까지 문제가 없습니다. 자, 제 문제는이 메시지에 결코 대답 할 수 없거나 적어도 늦게까지 할 수 있다는 것입니다.

내 제한 시간을 구현하기 위해 변경 사항을 찾고 있습니다. 그렇게하기 위해 Timer와 Reactive Extensions의 Observer를 시도했습니다. Th 문제는 항상 동일합니다. .NET Core 2를 사용하고 SynchronizationContext가 없기 때문에 주 스레드와 타이머 스레드를 동기화 할 수 없습니다.

그래서, 내 코드에서

 Observable 
     .Interval(TimeSpan.FromSeconds(timeOutInSeconds)) 
     .Subscribe(
      x => 
      { 
       timeoutCallback(); 
      }); 

시간이 콜백을 만료되면 호출해야합니다 .. 관찰자가있다. 이 메인 스레드에 슬로우되지 않는 이상, 당신은 이미 실현으로

TimeoutDelegate timeoutHandler =() => throw new WorkcenterRepositoryCommunicationException("Broker communication timed out.", null); 

는,이 예외가 사로 잡았되지 않습니다 : 내 발신자 방법에서, 나는 콜백이 방법을 처리합니다.

여기서 스레드를 동기화 할 수 있습니까?

미리 감사드립니다.

+0

어떻게 중개인에게 메시지를 보내시겠습니까? HttpClient? 다른 것? –

답변

0

"어떤 문제가 발생하면 실패하는"가장 좋은 방법은 IMHO가 적절한 예외를 throw하는 것이지만 확실히 return을 사용할 수는 있습니다. 예외를 피하기를 원한다면

이렇게하면 완료된/오류가 발생한 작업이 동 기적으로 완료되므로 호출자가 await을 사용하여 완료된 작업을 가져오고 동일한 스레드를 계속 사용할 수 있습니다.

CancellationToken을 사용하면 발신자가 사용자가 설명하는 경우가 아닌 작업을 취소 할 수 있습니다. Task.Yield는 작업을 종료하지 않고 다른 작업을 잠시 동안 실행하고 나중을 위해 자체적으로 일정을 재조정합니다.

+0

감사합니다. 타이머의 범위에서 예외를 던지려면 다른 스레드에서 throw됩니다. 같은 문제는 IMO. –

+0

다른 스레드에서 해당 예외 처리를 살펴볼 수 있습니다 여기 : https://stackoverflow.com/questions/5983779/catch-exception-that-is-thrown-in-different-thread –

관련 문제