Просто для здравомыслия других читателей обычная цель Task.FromResult<T>
, Task.CompletedTask
, Task.FromCancelation
и Task.FromException()
- предоставить простые фабричные методы для различных типов Task
(то есть с / без возвратной полезной нагрузки или для возврата исключения или отмены mimi c), и во всех случаях возвращенные задачи будут рассматриваться как IsCompleted
согласно источнику:
private const int TASK_STATE_COMPLETED_MASK = TASK_STATE_CANCELED | TASK_STATE_FAULTED
| TASK_STATE_RAN_TO_COMPLETION;
Согласно ответу @ Mar c, ожидающему уже IsCompleted
Задание замыкает короткое замыкание ожидающего, и выполнение будет продолжаться синхронно в том же потоке.
Согласно моему комментарию, было бы весьма необычно для непосредственного await
Задача, созданная Task.CompletedTask
или Task.FromResult
, так как этот компилятор генерирует ненужную asyn c оболочку конечного автомата , что является полным перерасходом в сценарии ОП.
Распространенным сценарием использования различных завершенных методов фабрики заданий может быть макет во время модульного тестирования, когда для смоделированного класса / интерфейса требуется вернуть Task
, но в остальном нет необходимости в * 1 023 *. Например, если следующий производственный интерфейс нуждался в насмешке или окурке:
public interface ISomeInterface
{
Task<DateTime> GetDateAsync();
}
, который может быть задан следующим образом:
public class MyMock : ISomeInterface
{
public Task<DateTime> GetDateAsync() // no async
{
// Directly return a completed task return a fake result
return Task.FromResult(new DateTime(2019, 11, 12, 0, 0, 0, DateTimeKind.Utc));
}
}
Затем будет ожидать тестируемый производственный класс (SUT) результат GetDateAsync()
для введенного (и теперь поддельного) ISomeInterface
, и, как правило, тот, кто вызвал метод, просто штамповал Задачу и вернул поддельные данные синхронно.