После Task.IsCompleted, что лучше: ждать или результат - PullRequest
0 голосов
/ 20 марта 2019

Я работаю в простом коде тайм-аута для моих запросов http. Я получил это

private async Task<HttpResponseMessage> ExecuteIOTask(Task<HttpResponseMessage> ioTask, int timeout)
    {
        var timeoutTask = await Task.WhenAny(Task.Delay(timeout), ioTask);

        if (ioTask.IsCompleted)
            return ioTask.Result;

        throw new TimeoutException();
    }

После IsCompleted, есть ли разница с использованием Result против await? В этом случае задача уже выполнена, поэтому я думаю, что производительность должна быть такой же. Но я немного беспокоюсь об обработке исключений. Я думаю, что Result не будет распространять исключения, но await будет.

Это правильно?

1 Ответ

1 голос
/ 20 марта 2019

Не используйте .Результат, всегда используйте await.

Обратите внимание, что .Result может вызвать взаимные блокировки и может вызвать непредсказуемое поведение в приложениях.

Единственный способ - получить дамп процесса, а затем проанализировать дамп в procdump.Поверьте мне, отладка будет очень сложной.

Ознакомьтесь с рекомендациями по асинхронному программированию в этом блоге.

Что касается обработки исключений, в этом блоге упоминается, что:

Каждая задача будет хранить список исключений.Когда вы ожидаете Задачу, первое исключение выдается повторно, поэтому вы можете перехватить определенный тип исключения (например, InvalidOperationException).Тем не менее, когда вы синхронно блокируете задачу с помощью Task.Wait или Task.Result, все исключения помещаются в AggregateException и выбрасываются.

Надеюсь, это поможет.

...