为什么Task的Result属性不可用于非generics任务(C#4.0+)?
我试图掌握.NET 4.0+任务并行库概念……
在以下C#4.0代码段中:
Task t = Task.Factory.StartNew(() => { Console.WriteLine("I am the task"); return "res1"; });
为什么编译器没有(和运行时)如果不能使用返回产生任何错误,除非使用通用任务:
Task t = Task.Factory.StartNew(() => { Console.WriteLine("I am the task"); return "res1"; });
或者它(返回的对象)可以使用?
我是否正确理解,只有在检测或确保返回类型(ed对象)或t.Result
时才需要Task
中的
Task
?
或者除了这个之外还有其他隐藏的必需品吗?
为什么这种类型不能从返回对象的类型中确定?
也就是为什么任务的Result属性不可用于非通用任务?
非genericsTask
没有Result
属性,因为它表示不生成结果的进程。
您的代码在两种情况下都会创建一个Task
,但在第一种情况下,您将其强制转换为Task
( Task
派生自Task
,这是合法的),因此您将失去引用结果的能力。
你可以直接看到这个:
Task t = Task.Factory.StartNew(() => { Console.WriteLine("I am the task"); return "res1"; }); var genericTask = t as Task; // genericTask will be non-null var result = genericTask.Result; // and you can access the result
Task
inheritance自Task
。 在这两种情况下,您实际上都在创建Task
,但在第一种情况下,您隐式将其强制转换为Task
,而Task
没有Result
属性。