可以肯定的是,这个问题最终会变得愚蠢而且没有实用价值,但无论如何。现在我仔细了解了多线程和并行编程。他们在所有资源上大致写了以下内容。“应用程序总是在前台线程中启动……”和“当所有前台线程终止时,所有后台线程也将终止,即使它们尚未完成任务。” 因此主题,为什么应用程序在明确指示时不终止
Thread.CurrentThread.IsBackground = true;
?
请帮我弄清楚。还有另一部预告片。实际区别是什么
Task task = new Task(MyTask);
从
Thread tr = new Thread(new ThreadStart(MyTask));
?
据我了解,由于任务调度程序,任务通常可以更有效地分配
对于问题的第一部分,我认为这是文档中的一个空白。该文档说明了当主要的非后台线程结束时会发生什么,但没有说明线程只是停止成为主线程而没有终止的情况。我没有在文档或语言规范中找到对此的引用。
关于问题的第二部分:
线程是与操作系统线程直接对应的物理(除了非常极端的特殊情况)执行线程。Task 是对将要执行的任务的抽象,对应于该任务的代码可以在一个或多个,有时甚至是零个线程中运行。
对于您给出的用例,效果上的差异可以忽略不计:在问题代码中调用的任务是在线程池中的线程上执行的,而线程是在池外创建的。但是在用法上是有区别的。
对于一个Thread,只能调用
Join
并同步等待它完成。对于 Task,您还可以使用 , 设置一个延续,
ContinueWith
以便在该 Task 完成时执行。或者,您可以使用等待任务异步await
完成。您可以在外部捕获并处理执行任务时发生的异常。这一切都是 Thread 所不具备的。