2017-12-07 25 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); 

、この例外は、catchedされることはありません。

ここでスレッドを同期するにはどうすればよいですか?

ありがとうございます!

+0

どのようにメッセージをブローカーに送信していますか? HttpClient?他に何か? –

答えて

0

「いくつかの問題で失敗する」最良の方法IMHOは適切な例外をスローすることですが、戻り値を使用することは間違いありません。あなたが例外を避けることを好むならば。

これは、同期して完了した完了/フォルトタスクを作成します。したがって、awaitを使用している呼び出し元は、完了したタスクを取得し、同じスレッドを使用し続けます。

CancellationTokenを使用すると、呼び出し元は操作をキャンセルできますが、これは記述していない場合です。 Task.Yieldは何らかの操作を終了せず、他のタスクをしばらく実行して後で再スケジューリングするだけです。

+0

ありがとうございます。タイマーのスコープから例外をスローすると、別のスレッドでスローされます。同じ問題IMO。 –

+0

別のスレッドでその例外処理を調べることができます ここに: https://stackoverflow.com/questions/5983779/catch-exception-that-is-thrown-in-different-thread –

関連する問題