在一个任务中连续循环

时间:2013-04-15 05:07:03

标签: .net task-parallel-library

我正在学习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]);
            }
        }
    }        
}

2 个答案:

答案 0 :(得分:2)

问题在于您没有等待Task完成。 Process在其所有前景Thread完成时结束。如果您手动创建Thread,默认情况下它会被创建为前台线程,因此在您创建的所有Thread之前,您的应用程序不会结束。

Task(默认情况下)在后台线程上运行(即使您指定LongRunning)。这意味着即使有一些Task仍在运行,您的应用程序也会结束。

你应该做些什么来解决这个问题,等待所有的Task完成。类似的东西:

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);

答案 1 :(得分:1)

如您所想,这是一个无限循环,请检查以下代码

static void Main(string[] args)
{
    Work2 w = new Work2();
    w.DoWork();
    Console.ReadKey();
}

请注意,我添加了以下代码 Console.ReadKey();

我现在看到一个滚动窗口,输出正在打印,并且仍在我的PC上运行:)

调试代码,你会发现在 workInstance 方法中调用的线程有

Thread.CurrentThread.IsBackground=true

当主线程退出时,即您的应用程序退出时,.NET Framework将自动终止 IsBackground 属性设置为“True”的任何线程

供您参考,

线程是后台线程或前台线程。后台线程与前台线程相同,但后台线程不会阻止进程终止。一旦属于某个进程的所有前台线程终止,公共语言运行库结束了该过程。