默认情况下,.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
}
}
请保持你的眼睛在这里的球。如果这对你很重要,那么很有可能你做错了什么。
我不相信你可以,你将不得不拿出一个自定义ThreadPool为了做到这一点。
托管线程池中的线程是后台线程。也就是说,他们的IsBackground属性是真实的。这意味着ThreadPool线程在所有前台线程退出后都不会让应用程序继续运行。
何时不使用线程池中的线程
有几种方案中,它是适当的创建和 管理自己的线程,而不是使用线程池中的线程:
- 您需要前景线程。
你可以设置线程池线程为前景。
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");
你想让它们成为前景来阻止你的进程终止吗?您可以保留一个引用计数,以确定您有多少个活动后台线程不会终止您的主线程(可能是前台,UI)线程,直到计数达到零。 –
@jeffamaphone +1。闻起来像“我不知道如何正确编程,所以我拿着一把锤子,并以某种方式让它工作,滥用我不知道的一切”。 – TomTom
嗯,我不想假设太多,但我更喜欢其中包括*为什么*你想做什么的问题,因为经常有更好的方法来自经验。 –