为什么Task的Result属性对于非泛型任务(C#4.0+)不可用?

时间:2013-03-12 11:06:41

标签: c# .net multithreading c#-4.0 task-parallel-library

我正在努力掌握.NET 4.0+任务并行库概念......

在以下C#4.0代码段中:

Task t = Task.Factory.StartNew(() =>
{
   Console.WriteLine("I am the task");
   return "res1";
});

为什么编译器没有(和运行时)如果不能使用返回产生任何错误,除非使用通用任务:

Task<string> t = Task.Factory.StartNew(() =>
{
   Console.WriteLine("I am the task");
   return "res1";
});

或者它(返回的对象)可以用吗?

我是否理解正确<string> Task<string>只需要检测或确定返回类型(ed对象)或t.Result? 或者除了这个以外还有其他隐藏的必需品吗?

为什么这种类型不能从返回对象的类型中确定?
即为什么任务的Result属性不可用于非泛型任务?

2 个答案:

答案 0 :(得分:16)

非通用Task没有Result属性,因为它表示生成结果的进程。

您的代码在两种情况下都会创建Task<string>,但在第一种情况下,您将其转换为TaskTask<string>派生自Task,这样才合法)所以你失去了参考结果的能力。

您可以直接看到:

Task t = Task.Factory.StartNew(() =>
{
   Console.WriteLine("I am the task");
   return "res1";
});

var genericTask = t as Task<string>; // genericTask will be non-null
var result = genericTask.Result;     // and you can access the result

答案 1 :(得分:0)

Task<T>继承自Task。在这两种情况下,您实际上都在创建Task<T>,但在第一种情况下,您隐式将其强制转换为Task,而Result没有{{1}}属性。