我正在学习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]);
}
}
}
}
答案 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”的任何线程
供您参考,
“线程是后台线程或前台线程。后台线程与前台线程相同,但后台线程不会阻止进程终止。一旦属于某个进程的所有前台线程终止,公共语言运行库结束了该过程。“