- Task有一个泛型子类叫做Task
,它允许发出一个返回值。 - 使用Func
委托或兼容的Lambda表达式来调用Task.Run就可以得到Task 。 随后,可以通过Result属性来获得返回的结果。
如果这个task还没有完成操作,访问Result属性会阻塞该线程直到该task完成操作。
class Program
{
static void Main(string[] args)
{
Task<int> task = Task.Run(() =>
{
Console.WriteLine("Foo");
return 3;
});
// 如果Task没完成,那么就阻塞
int result = task.Result;
Console.WriteLine(result);
}
}
class Program
{
static void Main(string[] args)
{
Task<int> primeNumberTask = Task.Run(() =>
Enumerable
.Range(2, 3000000)
.Count(n => Enumerable.Range(2, (int)Math.Sqrt(n) - 1).All(i => n % i > 0)));
Console.WriteLine("Task running...");
Console.WriteLine("The answer is " + primeNumberTask.Result);
}
}
Task
可以看作是一种所谓的“未来/许诺”(future、promise),在它里面包裹着一个Result,在稍后的时候就会变得可用。 - 在CTP版本的时候,Task
实际上叫做Future 。