2010-06-13 62 views
0

我有一个由Thread.Start()创建的长时间运行的线程。它使用大部分时间睡眠的QueueUserWorkItem衍生后台线程。如何终止产生另一个正在休眠的线程的线程?

然后,类的所有者得到处置我打电话thread1.Join()但自然它不会返回,因为它的子后台线程正在睡觉。

什么是正确的解决方案,以正常方式终止一个线程,其他线程很少麻烦?


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

首先,线程并不想因为后台线程而终止。但另一个原因。

第二 - 我不得不使用计时器,因为我没有理由持有线程 - 只能等待一天发生的事件!

这是非常愚蠢的我:)抱歉。

回答

1

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

+0

没有后台线程大多数时间睡觉。 – 2010-06-13 20:26:40

+0

@Bobb,在这种情况下,即使它只是在睡觉,你仍然在使用线程池的线程很长一段时间。这应该避免。 – 2010-06-13 20:35:14

+0

是的。请参阅下面的“答案”。我太迟了:) – 2010-06-14 14:37:09

0

如果使用.Abort,它将在适用的线程上导致ThreadAbortException异常 - 以尽可能优雅的方式对此进行响应。您也可以使用Begin/EndCriticalRegion。

+0

ThreadAbort是一个可怕的方式来结束一个线程。 http://www.bluebytesoftware.com/blog/2009/03/13/ManagedCodeAndAsynchronousExceptionHardening.aspx – Alan 2010-06-13 20:09:24

+0

http://www.interact-sw.co.uk/iangblog/2004/11/12/cancellation – Alan 2010-06-13 20:10:54

+0

http:// msmvps.com/blogs/senthil/archive/2008/12/17/the-dangers-of-thread-abort.aspx – Alan 2010-06-13 20:11:09

0

我不确定它是否是正确的解决方案,但我通常会让后台线程仅在很短的时间内睡眠,然后醒来检查状态,然后退出,做一些工作或再次入睡。如果你正在寻求绝对的性能,可能会不太好,但至少对于大多数非服务器应用程序,我会认为它会好的。