Создать завершенную задачу

Я реализую метод Task StartSomeTask() и узнаю результат уже до Task StartSomeTask() метода. Как создать задание , которое уже завершено?

Это то, что я сейчас делаю:

 private readonly Result theResult = new Result(); public override Task StartSomeTask() { var task = new Task(() => theResult); task.RunSynchronously(CurrentThreadTaskScheduler.CurrentThread); return task; } 

Есть ли лучшее решение?

 private readonly Result theResult = new Result(); public override Task StartSomeTask() { var taskSource = new TaskCompletionSource(); taskSource.SetResult(theResult); return taskSource.Task; } 

При настройке .NET 4.5 вы можете использовать Task.FromResult :

 public static Task FromResult(TResult result); 

Чтобы создать неудачную задачу, используйте Task.FromException :

 public static Task FromException(Exception exception); public static Task FromException(Exception exception); 

.NET 4.6 добавляет Task.CompletedTask если вам нужна не общая Task .

 public static Task CompletedTask { get; } 

Обходные пути для старых версий .NET:

  • При таргетинге на .NET 4.0 с Async Targetting Pack (или AsyncCTP) вы можете вместо этого использовать TaskEx.FromResult .

  • Чтобы получить не-общую Task перед .NET 4.6, вы можете использовать тот факт, что Task происходит из Task и просто вызывает Task.FromResult(null) или Task.FromResult(0) .

Для задач без возвращаемого значения в .NET 4.6 добавлена Task.CompletedTask .

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

Если вы используете Rx, альтернатива – Observable.Return (result) .ToTask ().

Вызов Task.WhenAll без каких-либо параметров вернет завершенную задачу.

 Task task = Task.WhenAll(); 
  • В чем разница между Task.Start / Wait и Async / Await?
  • Как SynchronizationContext.Current основного streamа становится нулевым в приложении Windows Forms?
  • Долгосрочная задача в WebAPI
  • Когда удалять CancellationTokenSource?
  • Как выполнить задачу на фоне wpf, когда вы можете предоставить отчет и разрешить аннулирование?
  • Почему TaskScheduler.Current по умолчанию TaskScheduler?
  • Поймать исключение, вызванное асинхронным методом
  • В чем преимущество использования async с MVC5?
  • Синхронно ждет асинхронной операции и почему Wait () заморозит программу здесь
  • Ожидание нескольких задач с разными результатами
  • Вложенность в Parallel.ForEach
  • Давайте будем гением компьютера.