Что используется для Task.FromResult <TResult> в С#

В С# и TPL (Параллельная библиотека задач) класс Task представляет текущую работу, которая производит значение типа T.

Я хотел бы знать, в чем заключается необходимость метода Task.FromResult?

То есть: В сценарии, в котором у вас уже есть готовое значение, какова необходимость его обратно в задачу?

Единственное, что приходит в голову, это то, что он использовался как некоторый адаптер для других методов, принимающих экземпляр Task.

Ответ 1

Существует два распространенных случая использования:

  • Когда вы реализуете интерфейс, который позволяет асинхронным абонентам, но ваша реализация является синхронной.
  • Когда вы стучите/высмеиваете асинхронный код для тестирования.

Ответ 2

Одним из примеров может служить метод, использующий кеш. Если результат уже вычислен, вы можете вернуть завершенную задачу со значением (используя Task.FromResult). Если это не так, то вы идете вперед и возвращаете задачу, представляющую текущую работу.

Пример кэша: Пример кэша с использованием Task.FromResult для предварительно вычисленных значений

Ответ 3

Из MSDN:

Этот метод полезен, когда вы выполняете асинхронную операцию, которая возвращает объект Task, и результат этого объекта Task уже вычислен.

http://msdn.microsoft.com/en-us/library/hh228607.aspx

Ответ 4

Используйте его, когда вы хотите создать ожидаемый метод, не используя ключевое слово async. Я нашел этот пример:

public class TextResult : IHttpActionResult
{
    string _value;
    HttpRequestMessage _request;

    public TextResult(string value, HttpRequestMessage request)
    {
        _value = value;
        _request = request;
    }
    public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
    {
        var response = new HttpResponseMessage()
        {
            Content = new StringContent(_value),
            RequestMessage = _request
        };
        return Task.FromResult(response);
    }
}

Здесь вы создаете собственную реализацию интерфейса IHttpActionResult, который будет использоваться в действии Web Api. Ожидается, что метод ExecuteAsync будет асинхронным, но вам не нужно использовать ключевое слово async, чтобы сделать его асинхронным и ожидаемым. Поскольку у вас уже есть результат и вам не нужно ничего ждать, лучше использовать Task.FromResult.

Ответ 5

Используйте Task.FromResult, если вы хотите иметь асинхронную операцию, но иногда результат получается синхронно. Здесь вы можете найти хороший образец http://msdn.microsoft.com/en-us/library/hh228607.aspx.