我正在努力掌握.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属性不可用于非泛型任务?
答案 0 :(得分:16)
非通用Task
没有Result
属性,因为它表示不生成结果的进程。
您的代码在两种情况下都会创建Task<string>
,但在第一种情况下,您将其转换为Task
(Task<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}}属性。