在c#中的程序中,我有2个线程与主线程分开。 当用户关闭表单时,我想终止主线程中的一个线程。 我该如何去做呢?如果可能,请向我提供代码。从另一个线程操作线程
回答
请不要使用Thread.Abort
作为迄今为止建议其他的答案,除非你希望你的程序处于未知状态(见Ian Griffiths和Chris Sells更多信息的文章)。如果关闭表单实际上应该是在杀死应用程序,那么你可能是可能是没问题 - 但在这种情况下,我建议只使用后台线程,当所有前台线程终止时它都会自动死机。
从乔·达菲的"Concurrent Programming in Windows":
有些情况下,线程中止始终是安全的两种情况:
- 线程的主要目的中止是推倒在CLR 的AppDomain卸载线程。 [...]
- 同步线程异常终止是安全的,只要调用者期望 从该方法抛出异常。 [...]
线程中止的所有其他用途充其量也是有问题的。 [...] 尽管线程中止在理论上比其他线程终止机制更安全,但它们仍然可能发生在不合时宜的时间,导致 不稳定和如果使用时不小心损坏。
(同步线程可放弃是当线程中止本身,而不是由另一个线程被中止。)
对于优美关闭(不冒着进入奇数状态)使用,其被周期性地设置一个标志从表单中检查并从其他线程中检查 - 考虑内存模型(例如,使标志变为挥发性,或者每次测试或设置时都使用锁定)。以我的article on the topic为例。
如果你想杀死你已经开始的线程,我会建议你持有一个对它的引用,如私人领域。当应用程序(或线程)完成时,您可以简单地在该线程上调用Thread.Abort()
。
例如:
private Thread _myWorker;
void doSomething()
{
_myWorker = new Thread(...);
_myWorker.Start();
}
void killWorker()
{
_myWorker.Abort()
}
你应该注意到,然后调用Abort()
线程上它会提高一个ThreadAbortException,你应该你的员工代码中捕获和处理,以清理等详细信息请参见Thread.Abort
此外,当您的应用程序关闭其主线程(消息循环,又名Application.Run)时,子线程也将被关闭。
子线程只会在后台线程自动关闭。在主线程关闭后,前台线程可以继续运行。 – 2009-04-21 05:31:37
从其他线程杀死线程几乎是总是一个坏主意。正确的方法是发信号通知终止,然后等待它。
这是因为线程应该是尽可能可行自己的资源完全负责,这包括他们的一生。
它并不需要很复杂,一个简单的变量,它可以被任何线程设置,并通过另一个线程读取定期会做(这是不是真的在任何语言,但你应该明白我的意思,如果你知道C):
int exitThread1 = false;
static void Thread1 (void) {
while (!exitThread1) {
// do stuff
}
}
static void mummyProc (void) {
int tid1 = startThread (Thread1);
// dum de dum de dum ...
exitThread1 = true;
joinThread (tid1);
}
- 1. 从另一个线程运行线程
- 2. 从另一个线程DoDragDrop()
- 3. HttpWebRequests从另一个线程
- 4. 从另一个线程
- 5. 从另一个线程
- 6. 杀从另一个线程
- 7. 从另一个线程
- 8. scrollToRowAtIndexPath从另一个线程
- 9. 从线程以外的线程访问跨线程操作
- 10. 线程交互(从一个线程到另一个线程的数据)c#
- 11. shared_from_this()从另一个线程(一个成员线程函数)
- 12. 在服务线程之外的另一个线程上运行服务操作
- 13. IO操作被挡住了我的UI线程,并另一个后台线程
- 14. 调用从一个线程到另一个线程执行另一个线程的方法
- 15. Python:在一个线程中停止另一个线程从另一个线程结束
- 16. 从另一个线程运行几个线程
- 17. 如何确定从另一个线程创建哪个线程?
- 18. forkIO线程和操作系统线程
- 19. 跨线程操作
- 20. 跨线程操作
- 21. 跨线程操作
- 22. C#从UI线程操纵线程
- 23. 从另一个线程操纵gui-elements - 执行此操作的常用方法?
- 24. 停止线程从另一个线程c侦听TcpClient#
- 25. 从事件派发线程(EventQueue)停止另一个线程
- 26. 从另一个线程更新GUI线程
- 27. PyGTK与线程,gobject,从另一个线程发送信号?
- 28. 如何杀死线程从另一个线程在vala
- 29. 访问与QTcpSocket从另一个线程(子线程)
- 30. 从另一个线程终止C++中的线程
要关闭表单,我有相应的事件。 我已经命名了我希望作为SecondThread终止的线程。 但是我无法调用SecondThread.Is我在这里失去了一些东西。 此外,如果有任何线程可以中止自己,将简化事情,因为我更喜欢使用标志的概念,因为你已经指出。 – Avik 2009-04-21 05:56:46