私は .Net 4.5 を使用しており、私のサービスは Async を使用して記述され、Task<> を返します。
クライアントからサービスを呼び出すときは、await を使用します。
待機後にサービスが戻ると、クライアント コードが非同期ではない別の操作を呼び出すと、チャネルがブロックされているように見えます。
サンプルコード:
value = await Service.InitAsync();
Service.SyncOperation(); // Further callbacks/return values from Server are blocked and this statement never returns
(async/await の全体的なポイントは、1 つのメソッドで完全なフローを記述し、フレームワークがスレッドとコールバックを処理できるようにすることです)
サービスへの呼び出しを新しいタスクでラップし、次に Task.Yield でラップすることで、これを解決できました。
async Task<T> CallAsync<T>(Func<Task<T>> func)
{
Task<T> t = await func;
await Task.Yield();
return t;
}
そしてクライアントで:
value = CallAsync(Service.InitAsync);
Service.SyncOperation(); //Now the server is not blocked since Yield changed back to the client context.
私の質問は、クライアントでサービス呼び出しをラップせずにこれを行う他の方法はありますか? おそらく、サービスの属性またはプロパティですか?
ありがとう