Сделайте запрос Http через Lambda Func

Я пытаюсь сделать запросы httpclient через вспомогательную функцию, которая будет управлять политикой опроса прерывателя цепи.

Я пытаюсь так это называть var response = clientFactory.MakeRequest(() => client.GetAsync("/"));

Внутри клиентской фабрики у меня определена моя политика автоматического выключателя, и я пытаюсь выполнить указанную выше лямбду, используя эту политику, например

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

Я новичок в Lambda в целом, и передача его как функции становится более запутанной. Как мне настроить функцию и первую строку кода для выполнения клиента и возврата HttpResponseMessage? Я не думаю, что Task<HttpResponseMessage> или Func<HttpResponseMessage> правильно


person Teragon    schedule 14.08.2017    source источник


Ответы (1)


Я бы посоветовал вам прочитать некоторую информацию об async / await (не lambdas), поскольку это ключ к пониманию того, как этого добиться.

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

Вы используете асинхронное программирование, поэтому должны решить, хотите ли вы использовать асинхронный метод MakeRequest или синхронный. Если вам нужен синхронный (но тогда - нет необходимости использовать ExecuteAsync. Я полагаю, что есть альтернатива Execute ()), просто напишите:

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

если вы хотите асинхронный:

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;
}
person Piotr    schedule 14.08.2017