C# эквивалент Scala Promise
В scala есть Promises и Futures. С помощью Promise я могу контролировать, когда Future завершается, т. е.
val p = Promise[Int]()
val fut: Future[Int] = p.future // I already have a running Future here
// here I can do whatever I want and when I decide Future should complete, I can simply say
p success 7
// and fut is now completed with value 7
Как я могу достичь аналогичных результатов с помощью API C# Task? Я не смог найти ничего подобного в документах.
Я хочу использовать это в тесте, издевательский объект возвращает такой Task, а затем я проверяю, выполняется ли какое-то условие до завершения задачи, затем завершаю его и проверяю другое условие.
3 ответов:
Вы можете использовать
TaskCompletionSource<T>:void Main() { var tcs = new TaskCompletionSource<bool>(); tcs.SetResult(true); Console.WriteLine(tcs.Task.IsCompleted); // prints true. }
Это
TaskCompletionSourceКак сказал Юваль,
TaskCompletionSource- это обещание, аTask- этоFuture, но обратите внимание, что в C# вы должны редко использоватьTaskCompletionSource.Причина в том, что
TaskCompletionSourceиспользуется для преобразования нецелевого API в основанный на задаче. В C# почти все API уже возвращаютTask.Так что пока они похожи - в C# вам редко нужно
TaskCompletionSource(гдеPromiseв scala является общим).Вы, вероятно, ищете
FromResultЕсли вы хотите создать макет API с задачами вы не хотите TaskCompletionSource, вы хотите
FromResult, который создает завершенную задачу на основе значения:void Fn() { var task = Task.FromResult(true); Console.WriteLine(task.IsCompleted); // prints true. Console.WriteLine(task.Result); // prints true. a ""blocking"" API }
Я думаю, что вам нужны задачи. Вы можете найти дополнительную информацию здесь.
Task<int> futureB = Task.Factory.StartNew<int>(() => F1(a)); int c = F2(a); int d = F3(c); int f = F4(futureB.Result, d); return f;Вы можете использовать try / catch, чтобы помочь вам справиться с возможной ошибкой.
Для принудительного ввода выходного значения вы можете использоватьTaskCompletionSource, Как указано выше другим пользователем.
Comments