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, а затем я проверяю, выполняется ли какое-то условие до завершения задачи, затем завершаю его и проверяю другое условие.

786   3  

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

    Ничего не найдено.