2013-03-12 17 views
7

私は.NET 4.0以降のタスク並列ライブラリの概念の把握を取得しようとしています...次のC#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"; 
}); 

または(返されるオブジェクト)を使用できますか?

Task<string><string>は、戻り値の種類(edオブジェクト)の検出または保証にのみ必要であることを正しく理解していますか?t.Result
これ以外の私の必需品から隠された他のものがありますか?

返されるオブジェクトの型からこの型を判別できないのはなぜですか?
I.非ジェネリックタスクでタスクのResultプロパティを使用できないのはなぜですか?

答えて

16

TaskにはResultというプロパティがありません。これは、ではなく、という結果を生成するプロセスであるためです。

あなたのコードでは、両方のケースでTask<string>を作成しますが、最初のケースでは、あなたはTaskにキャスト(Task<string>Taskから派生するので、それが合法だ)ので、あなたは結果を参照する能力を失います。 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 
+0

はい、私はそれを見ましたが、なぜ非ジェネリックなタスクが「結果」プロパティを持つことができないのか理解できませんでした。 – Fulproof

+1

@Fulproof概念的なことです。 'Task'は非同期/タスクワールドの' void'戻り型とほぼ概念的に同等ですが、 'Task 'は' T'戻り型と同等です。さて、 'void Foo()'メソッドを与えれば、 'var result = Foo();'を実行しようとしませんでしたか? :) –

+0

なぜ、ジェネリックでないタスク「アクティビティ」からのリターンは、エラーまたは警告としてコンパイラによって決定されないのですか? – Fulproof

-1

Task<T>継承:

あなたは直接これを見ることができます。どちらの場合も、実際にはTask<T>を作成していますが、最初のケースで暗黙的にTaskにキャストしています(Resultプロパティはありません)。

関連する問題