C#中的后台线程

7

我是一名新手,正在学习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(),还有什么其他技术可以让主线程等待吗?


3
在C#中,线程编程是一件相当有趣的事情。我强烈推荐Jeffrey Richter的《CLR via C#》一书,他从Windows内核开始详细解释了C#线程的工作原理。不幸的是,许多这些概念都依赖于C++ Win32线程API。 - Spence
3
你将会通过线程同步的操作有更多乐趣。请查看System.Threading.Semaphore、ManualResetEvent、AutoResetEvent、Mutex和Interlocked类。它们在执行线程操作时非常有用。 - Spence
谢谢Spence,非常感谢。我会看一下的。 - user186973
4个回答

12

1) 保持线程为后台线程有什么好处?

保持线程为后台线程的优势在于不会阻止程序终止。在大型应用程序中,如果要退出应用程序,则可能很难停用所有线程。

除了 Join(),我还能使用其他技术来使主线程等待吗?

如果您想让主程序等待,那么首先为什么要将线程设置为后台线程呢?除了 Join(),您还可以使用 EventWaitHandle 或 Monitor 来使主方法等待。


6

这只是一个决定线程是否保持进程活动的标记。如果你的进程中所有的线程都被标记为“后台”,.Net将关闭你的进程并强制退出。

回答您的问题,是的,您必须加入作为线程,因为在后台运行的线程不会使进程保持活动状态,因此当启动线程离开Main()时,它将允许应用程序退出。


3
如果线程在程序终止之前应该完成,那么它不应该是一个后台线程。
有很多方法可以使主线程等待,但在上面的例子中,我认为你真正想做的是确保它不是一个后台线程。
Join方法通常用于确保线程在调用线程继续之前执行完毕。例如,您可能会生成5个线程,每个线程都执行一些数学操作,并且这些操作的结果可能需要用于下一步。 Join方法将暂停调用线程上的执行,直到生成的线程完成。请注意,如果您从UI线程调用Join,则会冻结程序,直到生成的线程完成。
简而言之,多线程真的非常复杂和微妙。我强烈建议购买一本关于该主题的好书。

-1
你可以使用AutoResetEvent来使一个方法等待。
static AutoResetEvent obj = new AutoResetEvent();

然后从主函数开始

new Thread(SayHello).Start();
//Signal to start
obj.Set();

在 SayHello 函数内部

// wait
obj.WaitOne();

在这种情况下,您可以跳过 worker.IsBackground = true;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接