Ответ 1
Существует два распространенных случая использования:
- Когда вы реализуете интерфейс, который позволяет асинхронным абонентам, но ваша реализация является синхронной.
- Когда вы стучите/высмеиваете асинхронный код для тестирования.
В С# и TPL (Параллельная библиотека задач) класс Task
представляет текущую работу, которая производит значение типа T.
Я хотел бы знать, в чем заключается необходимость метода Task.FromResult?
То есть: В сценарии, в котором у вас уже есть готовое значение, какова необходимость его обратно в задачу?
Единственное, что приходит в голову, это то, что он использовался как некоторый адаптер для других методов, принимающих экземпляр Task.
Существует два распространенных случая использования:
Одним из примеров может служить метод, использующий кеш. Если результат уже вычислен, вы можете вернуть завершенную задачу со значением (используя Task.FromResult
). Если это не так, то вы идете вперед и возвращаете задачу, представляющую текущую работу.
Пример кэша: Пример кэша с использованием Task.FromResult для предварительно вычисленных значений
Из MSDN:
Этот метод полезен, когда вы выполняете асинхронную операцию, которая возвращает объект Task, и результат этого объекта Task уже вычислен.
Используйте его, когда вы хотите создать ожидаемый метод, не используя ключевое слово 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.
Используйте Task.FromResult, если вы хотите иметь асинхронную операцию, но иногда результат получается синхронно. Здесь вы можете найти хороший образец http://msdn.microsoft.com/en-us/library/hh228607.aspx.