[英]C# equivalent of 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
如何使用C# Task
API获得类似的结果? 我在文档中找不到任何相同的东西。
我想在测试中使用它,模拟对象返回这样的Task
然后在任务完成之前检查某些条件是否成立,然后完成它并检查另一个条件。
您可以使用TaskCompletionSource<T>
:
void Main()
{
var tcs = new TaskCompletionSource<bool>();
tcs.SetResult(true);
Console.WriteLine(tcs.Task.IsCompleted); // prints true.
}
我认为你需要的是任务。 你可以在这里找到更多信息。
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
。
TaskCompletionSource
就像Yuval所说, TaskCompletionSource
是一个Promise,一个Task
是一个Future
但请注意,在C#中你应该很少使用TaskCompletionSource
。
原因是TaskCompletionSource
用于将非任务API转换为基于任务的API。 在C#中,几乎所有API都已经是Task
-returning。
所以虽然它们很相似 - 在C#中你很少需要TaskCompletionSource
(scala中的Promise
很常见)。
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
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.