我是C#的新手。我了解到通常所有线程都是前景,除非你使用 IsBackGround = true 明确指定为“背景”线程。
在我脑海中浮现出一些疑惑。
1)将线程保留为后台线程有什么好处?
2)执行以下代码时:
static void Main(string[] args)
{
Thread worker = new Thread(SayHello);
worker.IsBackground = true;
worker.Start();
Console.WriteLine("Hello From Main");
}
static void SayHello()
{
Console.WriteLine("Hello World");
Console.ReadKey(true);
}
我需要使用worker.Join()来保持主线程等待程序立即终止。除了Join()我可以使用其他技术来保持主线程等待吗?
答案 0 :(得分:11)
1)保持一个人的优势是什么? 线程作为后台线程?
优点是后台线程不会阻止程序终止。在大型应用程序中,如果要退出应用程序,则可能有点难以停用所有线程。
除了Join(),我可以使用其他技术来保持主线程等待吗?
如果你想让Main程序等待为什么你首先让线程成为后台线程呢? 除了Join()之外,您还可以使用EventWaitHandle或Monitor来使主方法等待。
答案 1 :(得分:6)
这意味着该线程是否会使进程保持活动状态。如果进程中的所有线程都标记为后台,那么.Net将关闭您的进程并强制它退出。
在回答你的问题时,是的,你必须加入,因为后台的线程不能保持活着,因此当启动线程离开Main()时它将允许应用程序退出。
答案 2 :(得分:3)
如果线程应该在程序终止之前完成,那么它不应该是后台线程。
有很多方法可以让你的主线程等待,但在上面的例子中,我认为你真正想做的是确保它不是后台线程。
Join方法通常用于确保线程在调用线程继续之前完成执行。例如,您可以生成5个线程,每个线程执行一些数学运算,并且可能需要这些操作的结果才能继续下一步。 Join方法将在调用线程上暂停执行,直到生成的线程完成为止。重要的是要注意,如果从UI线程调用Join,您将冻结程序直到生成的线程完成。
简而言之,多线程非常复杂且细致入微。我强烈推荐购买一本关于这个主题的好书。