Создайте выполненную задачу
-
27-09-2019 - |
Вопрос
Я реализую метод Task<Result> StartSomeTask()
и случается, что знает результат уже до того, как метод называется. Как мне создать Задачаu003CT> что уже завершено?
Это то, что я сейчас делаю:
private readonly Result theResult = new Result();
public override Task<Result> StartSomeTask()
{
var task = new Task<Result>(() => theResult);
task.RunSynchronously(CurrentThreadTaskScheduler.CurrentThread);
return task;
}
Есть ли лучшее решение?
Решение
private readonly Result theResult = new Result();
public override Task<Result> StartSomeTask()
{
var taskSource = new TaskCompletionSource<Result>();
taskSource.SetResult(theResult);
return taskSource.Task;
}
Другие советы
При нацелении .NET 4.5 вы можете использовать Task.FromResult
:
public static Task<TResult> FromResult<TResult>(TResult result);
Чтобы создать неудачную задачу, используйте Task.FromException
:
public static Task FromException(Exception exception);
public static Task<TResult> FromException<TResult>(Exception exception);
.Net 4.6 добавляет Task.CompletedTask
Если вам нужен нередковый Task
.
public static Task CompletedTask { get; }
Обходные пути для более старых версий .NET:
При нацеливании .NET 4.0 с Async Targeting Pack (или AsynCCTP) вы можете использовать
TaskEx.FromResult
вместо.Чтобы получить неребные
Task
до .NET 4.6, вы можете использовать тот факт, чтоTask<T>
происходит отTask
и просто позвонитьTask.FromResult<object>(null)
илиTask.FromResult(0)
.
Для задач без возврата .NET 4.6 добавил Task.complendedtask..
Это возвращает задачу, которая уже находится в TaskStatus.rantComlection. Это, вероятно, возвращает один и тот же экземпляр каждый раз, но документация предупреждает вас не рассчитывать на этот факт.
Если вы используете RX, альтернатива наблюдается. Возврат (результат) .totask ().
Задача вызова. Почему без каких-либо параметров вернется завершенная задача.
Task task = Task.WhenAll();