Какая польза для задачи.FromResult в C#

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

Я хотел бы знать, что нужно для задач.FromResult способ ?

то есть: в сценарии, где у вас уже есть произведенное значение под рукой, что нужно обернуть его обратно в задачу?

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

5 ответов


есть два распространенных варианта использования, которые я нашел:

  1. когда вы реализуете интерфейс, который позволяет асинхронным вызывающим абонентам, но ваша реализация является синхронной.
  2. когда вы заглушаете / издеваетесь асинхронный код для тестирования.

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

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


используйте его, когда вы хотите создать ожидаемый метод без использования ключевого слова 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 для использования в действии веб-Api. Ожидается, что метод ExecuteAsync будет асинхронным, но вам не нужно использовать ключевое слово async, чтобы сделать его асинхронным и ожидаемым. Поскольку у вас уже есть результат и не нужно ничего ждать, лучше использовать Задача.FromResult.


из MSDN:

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

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


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