2017-08-14 15 views
3

サーキットブレーカポリポリシーを管理するヘルパ関数を使用してHTTPクライアントリクエストを作成しようとしています。ラムダファンクションを使用してHTTPリクエストを行う

私は私の回路ブレーカポリシーが定義されているクライアントの工場の内部そうvar response = clientFactory.MakeRequest(() => client.GetAsync("/"));

ようにそれを呼び出すようにしようとしていると私はそう

public async Task<HttpResponseMessage> MakeRequest(Func<HttpResponseMessage> request) 
    { 
    var response = policy.ExecuteAsync(() => request.Invoke()); 
    return response; 
    } 
のように、そのポリシーを使用して、上記のラムダを実行しようとしています

私はラムダ全体にとってかなり新しく、関数として渡すともっと混乱します。クライアントを実行し、HttpResponseMessageを返すために、関数と関数の最初の行をどのように設定するのですか? Task<HttpResponseMessage>またはFunc<HttpResponseMessage>が正しいとは思わない

答えて

2

これは、達成方法を理解するための鍵であるasync/await(lambdaではない)に関するいくつかの情報を読むことをお勧めします。

https://docs.microsoft.com/en-us/dotnet/csharp/async

あなたは非同期プログラミングを使用しているので、あなたは非同期メソッドを持ちたいMakeRequestたり、同期1が必要かどうか、決めなければなりません。

public async Task<HttpResponseMessage> MakeRequest(Func<HttpResponseMessage> request) 
{ 
    var response = policy.ExecuteAsync(() => request.Invoke()); 
    return response; 
} 

public void MyMethodUsingAsync() 
{ 
    var responsePromises = MakeRequest(() => {...}); 
    ///do some job wich will be done before response is retrieved (not waiting for it); and if you need it - use await 
    var responseReceived = await responsePromises; 
} 
:あなたは非同期をしたい場合

public HttpResponseMessage MakeRequest(Func<HttpResponseMessage> request) 
    { 
    var response = policy.ExecuteAsync(() => request.Invoke()); 
    return await response; 
    } 

: - あなたが同期したいない場合は、単純な書き込みを(。が、その後ExecuteAsyncを使用する必要が私は代替)(実行があることを、仮定します)

関連する問題