この種の問題を解決する最善の方法は、タスクを複数の異なる WCF メソッドに分割し、呼び出しを連鎖させることです。例:
これを行う代わりに(単なる概念実証):
serviceClient = new MyWCFClient();
serviceClient.TaskThatTakesForeverCompleted += (s,e) => { /*I'm done !*/ };
serviceClient.TaskThatTakesForeverAsync();
あなたはこれを行うことになります:
serviceClient = new MyWCFClient();
serviceClient.FirstTaskCompleted += (s,e) => { /*first task done!*/ serviceClient.SecondTaskAsync(); };
serviceClient.SecondTaskCompleted += (s,e) => { /*and so on... */ };
...
serviceClient.FirstTaskAsync();
サーバー側では、次のように実装します。
[OperationContract]
public <return type> FirstTask() { /* code */}
[OperationContract]
public <return type> SecondTask() { /* more code */ }
もちろん、これはあなたのケースには当てはまらないかもしれませんが、非常に長いタスクはこのように分割できます。
警告: この種の実装は、固定された順序で呼び出さなければならない一連のメソッド (FirstTask が最初で、次に SecondTask というように) を呼び出す必要があるため、間違いなくベスト プラクティスではありません。最後に、サービスが何をしているかを知るという問題を処理します。
理解するよりも説明する方が本当に難しいです。必要なのは、少しいじるだけで、非常に簡単なロジックです。
注: Async 呼び出しがない場合は、次の方法で有効にします。
- サービス参照を右クリック
- 「サービス参照の構成」
- 「非同期操作を生成する」をチェックし、「メッセージ コントラクトを生成する」をオフのままにして、他のすべてをそのままにします。
- これで、非同期呼び出しを自由に使用できるようになります