Как правильно ждать на лямбде веселья c делегата C# - PullRequest
0 голосов
/ 01 мая 2020

Я запутался в правильном способе использования передачи лямбды в fun c делегат для httpClient.

Например, Call является обобщенной c функцией, где есть ожидание в TaskFunctor делегат функции.

Каким должен быть правильный способ передачи функции HttpClient в lamda для taskFunctor, чтобы он мог ожидать ответа?

private async Task<HttpResponseMessage> Call(string operationId, Func<Task<HttpResponseMessage>> taskFunctor)
        {
            HttpResponseMessage response = null;
            try
            {
                response = await taskFunctor();
                s_tracer.Trace(0, "Got response for {0}: {1}", operationId, response.StatusCode);
            }
            catch (Exception ex)
            {
                s_tracer.Trace(0, "Got response for {0}: {1}", operationId, ex.Message);
            }

            return response;
        }

Какой правильный путь для make пройти лямбда?

public async Task<HttpResponseMessage> GetAsync2(string requestUri)
        {
            string absoluteRequestUri = requestUri;
            HttpClient httpClient = new HttpClient();

            HttpResponseMessage response = await Call(
                string.Format("HttpClientFacade:Get {0}", requestUri),
                async() => await httpClient.GetAsync(requestUri)); <<<<<<ASYNC Lamda

            return response;
        }

ИЛИ

 public async Task<HttpResponseMessage> GetAsync1(string requestUri)
        {
            string absoluteRequestUri = requestUri;
            HttpClient httpClient = new HttpClient();

            HttpResponseMessage response = await Call(
                string.Format("HttpClientFacade:Get {0}", requestUri),
                () => httpClient.GetAsync(requestUri));  <<<<<<Lamda

            return response;
        }  

1 Ответ

4 голосов
/ 01 мая 2020

В этом случае они практически одинаковы. Для простых лямбд, не стесняйтесь elide async и await. Однако, если ваша лямбда делает что-нибудь нетривиальным (т. Е. Все, что может вызвать исключения, или любые операторы using), то вы должны оставить async / await in.

Удаление async / await дает вам неизмеримо небольшое преимущество в производительности, но, скорее всего, код останется верным со временем, если вы их оставите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...