0

私は .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.

私の質問は、クライアントでサービス呼び出しをラップせずにこれを行う他の方法はありますか? おそらく、サービスの属性またはプロパティですか?

ありがとう

4

0 に答える 0