关闭多线程应用程序的所有线程
2011-04-30 12:49
155 查看
方法一:
对于多线程应用程序来说,如果直接点击右上角“关闭”按钮,或者使用“this.close()”来退出程序的话, 此时若某个子线程依然在处理数据,则虽然主程序窗口会关闭,但程序的进程并未退出,这就使得我们还要在“资源管理器”中找到该进程并强行关闭。
当然,对于有的程序来说,这种情况无所谓,主窗口关闭后,还未运行完毕的子线程继续运行,所有子线程都运行关闭后,程序的进程自动会关闭,这样还可以避免丢失子线程中正在处理的数据。
但是,有的时候,我们想要立即强行退出所有的线程,这时,可以在this.close()前加一句:
System.Diagnostics.Process.GetCurrentProcess().Kill();
请注意:使用以上方法前请先确认子线程中正在处理的数据的丢失是你可以承受的!
方法二:
启动了多个线程的程序在关闭的时候却出现了问题,如果程序退出的时候不关闭线程,那么线程就会一直的存在,但是大多启动的线程都是局部变量,不能一一的关闭,如果调用Thread.CurrentThread.Abort()方法关闭主线程的话,就会出现ThreadAbortException 异常。
后来找到了这个办法:Thread.IsBackground 设置线程为后台线程。msdn对前台线程和后台线程的解释:托管线程或者是后台线程,或者是前台线程。后台线程不会使托管执行环境处于活动状态,除此之外,后台线程与前台线程是一样的。一旦所有前台线程在托管进程(其中 .exe 文件是托管程序集)中被停止,系统将停止所有后台线程并关闭。通过设置 Thread.IsBackground 属性,可以将一个线程指定为后台线程或前台线程。例如,通过将 Thread.IsBackground 设置为 true,就可以将线程指定为后台线程。同样,通过将 IsBackground 设置为 false,就可以将线程指定为前台线程。从非托管代码进入托管执行环境的所有线程都被标记为后台线程。通过创建并启动新的 Thread 对象而生成的所有线程都是前台线程。如果要创建希望用来侦听某些活动(如套接字连接)的前台线程,则应将 Thread.IsBackground 设置为 true,以便进程可以终止。
所以解决办法就是在主线程初始化的时候,设置:Thread.CurrentThread.IsBackground = true; 这样,主线程就是后台线程,在关闭主程序的时候就会关闭主线程,从而关闭所有线程。但是这样的话,就会强制关闭所有正在执行的线程,所以在关闭的时候要对线程工作的结果保存。
对于多线程应用程序来说,如果直接点击右上角“关闭”按钮,或者使用“this.close()”来退出程序的话, 此时若某个子线程依然在处理数据,则虽然主程序窗口会关闭,但程序的进程并未退出,这就使得我们还要在“资源管理器”中找到该进程并强行关闭。
当然,对于有的程序来说,这种情况无所谓,主窗口关闭后,还未运行完毕的子线程继续运行,所有子线程都运行关闭后,程序的进程自动会关闭,这样还可以避免丢失子线程中正在处理的数据。
但是,有的时候,我们想要立即强行退出所有的线程,这时,可以在this.close()前加一句:
System.Diagnostics.Process.GetCurrentProcess().Kill();
请注意:使用以上方法前请先确认子线程中正在处理的数据的丢失是你可以承受的!
方法二:
启动了多个线程的程序在关闭的时候却出现了问题,如果程序退出的时候不关闭线程,那么线程就会一直的存在,但是大多启动的线程都是局部变量,不能一一的关闭,如果调用Thread.CurrentThread.Abort()方法关闭主线程的话,就会出现ThreadAbortException 异常。
后来找到了这个办法:Thread.IsBackground 设置线程为后台线程。msdn对前台线程和后台线程的解释:托管线程或者是后台线程,或者是前台线程。后台线程不会使托管执行环境处于活动状态,除此之外,后台线程与前台线程是一样的。一旦所有前台线程在托管进程(其中 .exe 文件是托管程序集)中被停止,系统将停止所有后台线程并关闭。通过设置 Thread.IsBackground 属性,可以将一个线程指定为后台线程或前台线程。例如,通过将 Thread.IsBackground 设置为 true,就可以将线程指定为后台线程。同样,通过将 IsBackground 设置为 false,就可以将线程指定为前台线程。从非托管代码进入托管执行环境的所有线程都被标记为后台线程。通过创建并启动新的 Thread 对象而生成的所有线程都是前台线程。如果要创建希望用来侦听某些活动(如套接字连接)的前台线程,则应将 Thread.IsBackground 设置为 true,以便进程可以终止。
所以解决办法就是在主线程初始化的时候,设置:Thread.CurrentThread.IsBackground = true; 这样,主线程就是后台线程,在关闭主程序的时候就会关闭主线程,从而关闭所有线程。但是这样的话,就会强制关闭所有正在执行的线程,所以在关闭的时候要对线程工作的结果保存。
相关文章推荐
- 关闭多线程应用程序的所有线程
- Dotnet中强行关闭多线程应用程序的所有线程
- Dotnet中强行关闭多线程应用程序的所有线程
- 多线程关闭窗体时所有线程都退出的方法
- C# WinForm程序中,使用多线程,在关闭窗体时 怎么关闭窗体的所有线程,使程序退出。
- 主线程退出时(关闭应用程序时)关闭所有线程
- C# 线程手册 第五章 扩展多线程应用程序 - 什么是线程池
- QT 应用程序关闭某个窗口时,关闭打开的所有其他窗口并退出程序
- Java多线程--让主线程等待所有子线程执行完毕在执行
- QT 应用程序关闭某个窗口时,关闭打开的所有其他窗口并退出程序 【转】
- 【原创】《Linux高级程序设计》杨宗德著 - Linux多线程编程 - 线程概念及创建线程 分类: Linux --- 应用程序设计 2014-11-19 17:31 82人阅读 评论(0) 收藏
- Java 7之多线程 - 线程的取消与关闭
- C#构建多线程应用程序(1) —— 使用委托来自动创建次线程以实现异步方法的调用
- 多线程,线程创建及关闭句柄存在的问题,终止线程的运行的几个函数
- Linux下多线程程序崩溃时如何提取出所有线程的函数调用栈(一)
- Android程序有很多Activity,在B中如何关闭整个Android应用程序,关闭所有的 Activity
- Java:多线程等待所有线程结束(CountDownLatch/CyclicBarrier) .
- Qt多线程编程总结(一)(所有GUI对象都是线程不安全的)
- C#构建多线程应用程序(3) —— 前台线程和后台线程
- 关闭应用程序所有activity