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

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

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

您应该做的是等待所有Tasks 完成。就像是:

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 回答
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”的线程

供你参考,

"线程要么是后台线程,要么是前台线程。后台线程与前台线程相同,只是后台线程不会阻止进程终止。一旦属于某个进程的所有前台线程都已终止,公共语言运行时将结束过程。

于 2013-04-15T08:59:13.877 回答