0

私は並列プログラミングの初心者です。以下に基本的なコードを書きますが、例外として常に実行されるとは限りません。

Console.WriteLine ("Start");

Task task = Task.Factory.StartNew(() => {

  for (int i = 0; i < 5; i++)
{
    Console.WriteLine (i);
}

});

Console.WriteLine ("End");

私は通常、10回の試行のうち8〜9回のループの結果を得ることができませんでした。ループ結果を出力する場合と出力しない場合があります。しかし、私は常にとを印刷しStartますEnd。後ろ側で何が起こっているのですか?ループの結果が時々得られないことがあるのはなぜですか?

前もって感謝します、

4

3 に答える 3

3

並列ループが出力を出力する機会を得る前に、プログラムは終了します。

Console.WriteLine ("Start");
Task task = Task.Factory.StartNew(() => {
for (int i = 0; i < 5; i++)
{
    Console.WriteLine (i);
}
});

Console.ReadLine();
Console.WriteLine("End");

入力を待って一時停止すると、ループが正しく実行されていることがわかります。

于 2012-07-16T13:14:02.093 に答える
1

最後にreadlineを追加します。次のように表示されます。

Start
End
0
1
2
3
4

Console.WriteLine("Start");

Task task = Task.Factory.StartNew(() =>
{

    for (int i = 0; i < 5; i++)
    {
        Console.WriteLine(i);
    }

});

Console.WriteLine("End");
Console.ReadLine();
于 2012-07-16T13:16:45.280 に答える
1

タスクが終了するまで待つようにメインスレッドに指示する必要があります。

ほとんどの場合、タスクスレッドが実行される前に「終了」が出力されていました。TaskContinuationOptionsタスクスレッドが完了するのを待つように親スレッドに指示するために使用します。

Console.WriteLine ("Start");
Task task = Task.Factory.StartNew(() => {
for (int i = 0; i < 5; i++)
{
    Console.WriteLine (i);
}
});
task.ContinueWith(ant =>
{
    Console.WriteLine("End");
}, TaskContinuationOptions.NotOnFaulted| TaskContinuationOptions.AttachedToParent);
task.Wait();
于 2012-07-16T13:16:56.410 に答える