• Task有一个泛型子类叫做Task,它允许发出一个返回值。
    • 使用Func委托或兼容的Lambda表达式来调用Task.Run就可以得到Task
    • 随后,可以通过Result属性来获得返回的结果。

      • 如果这个task还没有完成操作,访问Result属性会阻塞该线程直到该task完成操作。

        1. class Program
        2. {
        3. static void Main(string[] args)
        4. {
        5. Task<int> task = Task.Run(() =>
        6. {
        7. Console.WriteLine("Foo");
        8. return 3;
        9. });
        10. // 如果Task没完成,那么就阻塞
        11. int result = task.Result;
        12. Console.WriteLine(result);
        13. }
        14. }
        1. class Program
        2. {
        3. static void Main(string[] args)
        4. {
        5. Task<int> primeNumberTask = Task.Run(() =>
        6. Enumerable
        7. .Range(2, 3000000)
        8. .Count(n => Enumerable.Range(2, (int)Math.Sqrt(n) - 1).All(i => n % i > 0)));
        9. Console.WriteLine("Task running...");
        10. Console.WriteLine("The answer is " + primeNumberTask.Result);
        11. }
        12. }
    • Task 可以看作是一种所谓的“未来/许诺”(future、promise),在它里面包裹着一个Result,在稍后的时候就会变得可用。

    • 在CTP版本的时候,Task实际上叫做Future