12

.NET4.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>inTask<string>は、返品のタイプ(edオブジェクト)またはのタイプを検出または保証するためにのみ必要であることを正しく理解していt.Resultますか?
それとも、これ以外に私から隠された必需品はありますか?

返されたオブジェクトのタイプからこのタイプを判別できないのはなぜですか?
つまり、タスクのResultプロパティが一般的でないタスクで使用できないのはなぜですか?

4

2 に答える 2

21

非ジェネリックは、結果を生成しないプロセスを表すため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
于 2013-03-12T11:08:46.460 に答える
0

Task<T>から継承しTaskます。どちらの場合も、実際にはを作成していますが、最初のケースでは、プロパティを持たないにTask<T>暗黙的にキャストしています。TaskResult

于 2013-03-12T11:11:34.327 に答える