1

エラーなしで終了するタスク内で無限 while ループを呼び出すときに、TPL C# を学習しています。私は何か間違ったことをしていますか?以下はサンプルコードです。

class Work2
{
    public void DoWork()
    {
        List<string> scenarios = new List<string>();
        scenarios.Add("work");
        scenarios.Add("climb");
        scenarios.Add("walk");
        scenarios.Add("run");

        List<int> id = new List<int>();
        id.Add(1);
        id.Add(2);
        id.Add(3);
        id.Add(4);

        for (int i = 0; i < 2; i++)
        {
            Task.Factory.StartNew(() =>
            {
                workInstance(id[i], scenarios);
            }, TaskCreationOptions.LongRunning);

            Thread.Sleep(500);
        }     
    }

    public void workInstance(int id, List<string> scenario)
    {
        string Guid = System.Guid.NewGuid().ToString();
        for (int i = 0; i < scenario.Count(); i++)
        {
            scenario[i] = scenario[i] + " " + Guid + " " + Thread.CurrentThread.ManagedThreadId;
        }

        while (true)
        {
            for (int i = 0; i < scenario.Count(); i++)
            {
                Console.WriteLine(scenario[i]);
            }
        }
    }        
}
4

2 に答える 2

2

Task問題は、 s が完了するのを待っていないことです。AProcessは、すべてのフォアグラウンドThreads が完了すると終了します。を手動で作成するThreadと、デフォルトではフォアグラウンド スレッドとして作成されるため、Thread作成したすべての が終了するまでアプリケーションは終了しません。

ただし、Taskは (デフォルトで) バックグラウンド スレッドで実行されます ( を指定した場合でもLongRunning)。Taskこれは、いくつかの がまだ実行中であっても、アプリケーションが終了することを意味します。

Taskこれを修正するためにすべきことは、すべてのs が終了するのを待つことです。何かのようなもの:

var tasks = new Task[2];

for (int i = 0; i < 2; i++)
{
    tasks[i] = Task.Factory.StartNew(() =>
    {
        workInstance(id[i], scenarios);
    }, TaskCreationOptions.LongRunning);
}

Task.WaitAll(tasks);
于 2013-04-15T10:54:26.407 に答える