方法があります
public Task<Task> DoSomeWorkOnARemoteMachine()
非常に説明的に言えば、次の方法でリモートマシンでいくつかの作業を実行します。
- 作業を行う必要があることを知らせるメッセージ バス上のメッセージをキューに入れる
- リモート エージェントがメッセージを受け取り、作業を実行します。
- 作業が終了し、エージェントはメッセージ バスでメッセージをキューに入れ、作業が完了したことを伝えます。
- 作業を呼び出したアプリケーションは、作業が完了したというメッセージを受け取ります
私が使用した理由Task<Task>
は、1 つ目Task<>
はメッセージのキューイングのためです。Task
一方、リモート マシンで作業が完了したとき (つまり、エージェントからのメッセージが受信されたとき) は、内部が完了します。作業の実行中にリモート エージェントがキャッチした例外は、完了メッセージと共に渡され、内部のTask
完了時に再度スローされます。
このメソッドを呼び出すには、次を使用します。
await await DoSomeWorkOnARemoteMachine();
メッセージがキューに入れられてジョブを実行し、ジョブを完了して例外を受け取るまで待機します。ただし、ジョブがリモート エージェントで完了したかどうかに関心がない場合は、次のように呼びます。
await DoSomeWorkOnARemoteMachine();
これはawait
インナーではありませんTask
。ただし、内部Task
(リモート エージェントからメッセージを受信し、例外を再スローする) は、まだある時点で実行されます。これはちょっともったいない気がするので、結果が出ないときは実行するのは避けたいと思いawait
ます。
したがって、私の質問は次のとおりです。それTask
がedされているかどうかを「認識」しawait
、そうでない場合は実行しないか、他のコードパス(空のTask
本体など)を実行することは可能ですか。
「発射して忘れる」フラグを渡す、または「発射して忘れる」のオーバーロードを追加するなど、実装できる代替手段があることを認識しています。クライアントAPIを変更せずにこれを実装できれば素晴らしいのですが
この種のリモート作業の実行を実装する他のプロジェクトに関する回答も素晴らしいでしょう!