Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何终止一个产生了另一个休眠线程的线程?_C#_Multithreading - Fatal编程技术网

C# 如何终止一个产生了另一个休眠线程的线程?

C# 如何终止一个产生了另一个休眠线程的线程?,c#,multithreading,C#,Multithreading,我有一个由thread.Start()组成的长线程。它使用QueueUserWorkItem生成一个后台线程,该线程大部分时间处于休眠状态 然后类所有者被释放,我调用thread1.Join(),但它自然不会返回,因为它的子后台线程正在休眠 什么是正确的解决方案,可以优雅地终止一个有其他线程的线程 在我写了这个问题之后,我突然意识到,当我做这个部分的时候,我可能有一个心理障碍 首先,线程不想终止,不是因为后台线程。但还有另一个原因 在第二种情况下,我不得不使用计时器,因为我无缘无故地持有一个线

我有一个由thread.Start()组成的长线程。它使用QueueUserWorkItem生成一个后台线程,该线程大部分时间处于休眠状态

然后类所有者被释放,我调用thread1.Join(),但它自然不会返回,因为它的子后台线程正在休眠

什么是正确的解决方案,可以优雅地终止一个有其他线程的线程


在我写了这个问题之后,我突然意识到,当我做这个部分的时候,我可能有一个心理障碍

首先,线程不想终止,不是因为后台线程。但还有另一个原因

在第二种情况下,我不得不使用计时器,因为我无缘无故地持有一个线程,只是为了等待每天发生一次的事件


我真是太傻了:)对不起。

对于短期线程,使用线程池线程通常是好的。
如果需要长时间运行的后台线程,请使用新的线程实例并将其后台属性设置为true。

如果使用.Abort,则会在适用的线程上导致ThreadAbortException-请尽可能优雅地对此作出响应。您也可以使用Begin/EndCriticalRegion。

我不确定它是否是正确的解决方案,但我通常只让后台线程睡眠一小段时间,然后醒来检查状态,然后退出,做一些工作或再次进入睡眠。如果您希望获得绝对性能,则可能不太好,但至少对于大多数非服务器应用程序来说,我认为这是可以的。

ThreadAbort是结束线程的可怕方式。不,背景线程大部分时间处于休眠状态。@Bobb,在这种情况下,您仍在使用线程池的线程很长时间,即使它只是处于休眠状态。这是应该避免的。见下面我的“答案”。我也有点晚了:)