默认情况下,.NET 中的线程池使用后台线程。
我无法将其更改为前台运行。
如何将其更改为作为前台线程运行?
编辑:
我需要使用它,因为我正在更改我的应用程序由于大量处理(在此之前我手动处理线程,默认情况下是前台线程),我不想更改我的应用程序只是为了使其适应背景线程场景..
我想知道为什么线程池默认不是前台
默认情况下,.NET 中的线程池使用后台线程。
我无法将其更改为前台运行。
如何将其更改为作为前台线程运行?
编辑:
我需要使用它,因为我正在更改我的应用程序由于大量处理(在此之前我手动处理线程,默认情况下是前台线程),我不想更改我的应用程序只是为了使其适应背景线程场景..
我想知道为什么线程池默认不是前台
“后台线程”的概念在 .NET 中意义不大。Thread.IsBackground 属性只是一个简单的标志,它帮助 CLR 在 AppDomain 卸载时决定是否应该粗鲁地中止线程,或者是否应该等待线程自愿退出。
如果您希望线程池线程在程序退出时继续运行,您可以更改该属性。这个片段显示了这是如何可能的:
using System;
using System.Threading;
class Program {
static void Main(string[] args) {
var sync = new ManualResetEvent(false);
ThreadPool.QueueUserWorkItem((_) => {
Console.WriteLine("Running");
Thread.CurrentThread.IsBackground = false;
sync.Set();
Thread.Sleep(5000);
Console.WriteLine("Done, should exit now");
Thread.Sleep(250);
});
sync.WaitOne(); // Ensures IsBackground is set
}
}
请注意这里的球。如果这对您很重要,那么您很可能做错了什么。
您可以将线程池线程设置为前台。
class Program
{
static void Main(string[] args)
{
new Action(() => Worker()).BeginInvoke(null,null);
Thread.Sleep(1000);
Console.WriteLine("Main ends here");
}
static void Worker()
{
Thread.CurrentThread.IsBackground = false;
Console.WriteLine("Worker started. Bg {0} Tp {1}.",
Thread.CurrentThread.IsBackground,
Thread.CurrentThread.IsThreadPoolThread);
Thread.Sleep(5000);
Console.WriteLine("Worker ends here");