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


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

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

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

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

5 128

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

от MSDN:

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

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

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