`
hewei870723
  • 浏览: 63019 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

C# 当主程序关闭结束子线程

阅读更多

发表于:2008-02-03 15:15:17不知道是c#设计疏忽还是我没找到方对,.net一直无法强行线程子线程的操作
不知道大家注意没有,如果子线程里有 死循环(有时间必须用循环)或子线程在进行一个阻塞式的操作,如影响队列里的消息,那么不能主线程用什么方式终止子线程都没门,
  this.thread.Suspend();
                    this.thread.Abort()
通通不管用,得调用win32api去强行终止,我的妈呀.net又把你赶回win32时间了
Abort() 方法也只是建议子线程终止,而不是无条件强行终目,这个不好,比如应用程序要退出,子线程结束不了会一直驻留内存exe都不会退出进程,有什么办法强行终止子线程哈,不要说类似于(不要用死循环,无意义之类的话,那对阻塞式的操作怎么说呢)




对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 回复次数:21 

LeoMaya

(postreetboy)

等 级:
#1楼 得分:0回复于:2008-02-03 15:31:21这个情况下, 试试在FormClosing事件里面把线程Suspend


对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 精华推荐:本贴收集C#完整的通信代码(点对点,点对多,同步,异步,UDP,TCP),多多宜善。

buycode001

(fds)

等 级:
#2楼 得分:0回复于:2008-02-03 15:37:03楼上的真是知音啊,我的问题就是发生在这种情况,也这么处理,但是无效
  private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            try
            {
                if(this.thread != null)
                {
                    this.thread.Suspend();
                    this.thread.Abort();
                }
            }
            catch
            {
                MessageBox.Show("异常终止线程");
            }
        }
照说来 Abort 一定会引发异常,可是却没有,奇怪


对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 精华推荐:SQLServer2005 String类的移植尝试

tuyile006

(小y)

等 级:
#3楼 得分:0回复于:2008-02-03 15:54:26这样子:

C# code
/// <summary>
        /// 强制停止线程
        /// </summary>
        /// <param name="t"></param>
        private void ForcedKillThread(Thread thread)
        {
            try
            {
                thread.Abort();
                thread.Join();
            }
            catch (Exception ex)
            {
                ModuleUtil.WriteErrLog("线程停止错误,具体描述信息:\r\n" + ex.Message);
            }
        }




对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 精华推荐:.net老版主的面试,分享共勉

LeoMaya

(postreetboy)

等 级:
#4楼 得分:0回复于:2008-02-03 15:54:41是FormClosing事件喔
之前我也遇到这个问题, 就在FormClosing事件里面把线程Suspend了就可以了


对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 精华推荐:【散分】公布一些常用的WebServices,希望对大家的应用有帮助~

buycode001

(fds)

等 级:
#5楼 得分:0回复于:2008-02-03 16:02:59死循环的问题解决了,可是线程阻塞的问题还是没有解决
[C# code]
private void Recevie()
        {
            try
            {
                string queuename = ".\\private$\\testQueue";//队列名称
                MessageQueue q;
                q = new System.Messaging.MessageQueue(queuename);
                System.Messaging.Message m = q.Receive();
                m.Formatter = new XmlMessageFormatter(new Type[] { typeof(string) });
                this.Invoke(new TestDelegate(DelegateMethod), m.Label, m.Body);
            }
            catch
            {
            }
        }
private void NewThread()
        {
            //for (int i = 0; i > -1; i++)
            while(true)
            {
                System.Threading.Thread.Sleep(0);
                this.Recevie();

            }
        }



对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 精华推荐:Share Some Methods about Linq to Entry

buycode001

(fds)

等 级:
#6楼 得分:0回复于:2008-02-03 16:04:20这一句的时候把线程阻死了 System.Messaging.Message  m  =  q.Receive();
不管等多少,线程都是死的


对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 

BookSirSwordsMan

(書生)

等 级:
#7楼 得分:0回复于:2008-02-03 16:58:16晕,简单点,把线程设置为后台线程不就得了,还要弄个你死我活的,找不到解决方案

后台线程,在你程序关闭的时候,它也会自动销毁的


对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 

BookSirSwordsMan

(書生)

等 级:
#8楼 得分:0回复于:2008-02-03 17:04:13你的程序代码设计得有点问题

可以试试在退出的时候用
System.Environment.Exit(System.Environment.ExitCode);
Application.Exit();

还用在那些线程开始前,使用它的属性IsBackground,好像是这个,把它设为true,这样在你程序结束的时候,线程也会自动结束


对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 

lsqtonyfh

(小白)

等 级:
#9楼 得分:0回复于:2008-02-03 17:26:55mark


对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 

husongxp

(husongxp)

等 级:
#10楼 得分:0回复于:2009-03-17 16:51:19


对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 

djc7811

(袋子)

等 级:
#11楼 得分:0回复于:2009-03-17 16:54:23把线程设置成后台线程就可随程序的关闭而关闭



对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 

li45214521

(简化设计)

等 级:
#12楼 得分:0回复于:2009-03-17 18:57:47其实windows 线程是不能杀掉的


对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 

gisyellow

(溪竹)

等 级:
#13楼 得分:0回复于:2009-03-17 20:08:03试试API函数


对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 

zhubenwuzui

(猪笨无罪)

等 级:
#14楼 得分:0回复于:2009-04-27 19:38:027楼经典,说得太对了!


对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 

Sysping1

(回贴不为抢分)

等 级:
#15楼 得分:0回复于:2009-04-27 19:44:28引用 7 楼 BookSirSwordsMan 的回复:
晕,简单点,把线程设置为后台线程不就得了,还要弄个你死我活的,找不到解决方案

后台线程,在你程序关闭的时候,它也会自动销毁的


对!


对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 

mailhui

(张辉)

等 级:
#16楼 得分:0回复于:2009-06-29 23:56:427楼高人!搞了一下午,终于解决问题了多谢


对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 

LQknife

(安乃定:不吃头疼,吃了上瘾。)

等 级:
#17楼 得分:0回复于:2009-06-30 08:32:03q.Receive()是阻塞的


对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 

youHavesi



等 级:
#18楼 得分:0回复于:2009-06-30 10:41:03真是的,为什么要强行呢,

while(IsRun)
{
}

FormClosing()
{
IsRun=false;
}

或者将线程干脆设置为后台线程。


对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 

wangbin8143

(阿岑)

等 级:
#19楼 得分:0回复于:2009-08-21 10:36:22引用 15 楼 sysping1 的回复:
引用 7 楼 BookSirSwordsMan 的回复:
晕,简单点,把线程设置为后台线程不就得了,还要弄个你死我活的,找不到解决方案

后台线程,在你程序关闭的时候,它也会自动销毁的

对!



对什么啊
编程中的情况有太多种了。比如UDP通讯
比如我的软件中有一个主的等待线程,接收到一个有效消息后,就会分配一个端口,开启一个新的监听线程。
客户端会不断的向这个端口发送心跳包。
如果超时就认为是客户端断开了连接。客户端就要重新去主线程去申请端口。
当然我也要强行结束没有心跳包发来的 线程,关闭端口。怎么可能不断的开线程不销毁呢。


对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 

pcnetman888

(儒道佛)

等 级:
#20楼 得分:0回复于:2009-08-21 12:21:24MARK


对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 

robin521



等 级:
#21楼 得分:0回复于:2009-08-21 12:35:28我来学习一下.楼主可以把线程做为互斥的,一到你说的情况就互斥,这样不就解决了吗?


对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 

 

感觉很好,并且把我的问题解决,所以转载下 转载地址:http://topic.csdn.net/u/20080203/15/4579637f-410d-4f7d-b0bb-f04661133224.html

分享到:
评论

相关推荐

    c# 多线程任务中结束全部线程

    在C#中,多线程是程序设计中的一个重要概念,它允许程序同时执行多个操作,从而提高程序的效率和响应性。然而,在某些情况下,我们可能需要终止正在运行的所有线程,这通常发生在应用程序需要关闭或者某个关键错误...

    防止C#应用程序被任务管理器结束

    标题提到的“防止C#应用程序被任务管理器结束”实际上涉及到的是进程保护技术,尤其是针对用户尝试通过任务管理器手动结束进程的情况。在Windows操作系统中,任务管理器是用户管理和控制进程的主要工具,但有一些...

    c# winform 关闭窗体时同时结束线程实现思路

    然而,当窗体关闭时,如果不正确地管理这些线程,它们可能会继续运行,导致应用程序资源无法释放,甚至在任务管理器中显示为挂起的进程。这个问题在标题和描述中已经提到,通过设置线程的`IsBackground`属性为`true`...

    WinForm C#多线程等待窗体

    在C#编程中,Windows Forms(WinForm)应用程序经常需要处理多线程操作,以便实现非阻塞用户界面。在标题“WinForm C#多线程等待窗体”中,我们探讨的关键点是如何在进行耗时操作时创建一个等待窗体,让用户知道程序...

    C#多线程之如何弹出一个模式窗口来显示进度条

    在C#编程中,多线程技术是一种常见且强大的工具,用于提高应用程序的性能和响应性。当一个耗时的任务需要执行时,如文件读写、网络请求或复杂的计算,多线程可以使用户界面(UI)保持流畅,不被长时间阻塞。在本教程...

    C# Winform在MDI中打开一个子窗体关闭上一个子窗体

    在C# Winform编程中,MDI(Multiple Document Interface)多文档界面是一种常见的窗口布局方式,它允许在一个主窗口中嵌套多个子窗口,每个子窗口可以独立操作,但共享同一菜单栏、工具栏等资源。本文将深入探讨如何...

    C# socket 多线程实例

    在多线程环境中,正确的关闭服务器需要确保所有正在运行的线程都被妥善终止,资源被正确释放,而不仅仅是简单地停止主程序。可以通过设置一个全局标志来指示服务器是否应停止接收新连接,并让每个处理线程在完成当前...

    C#关闭外部程序源码

    在C#编程中,关闭外部程序是一项常见的任务,特别是在系统集成、自动化测试或者需要控制其他应用程序行为的场景下。本文将深入探讨如何使用C#来实现这一功能,并提供相关的源码示例。 首先,我们需要了解在C#中操作...

    C# Socket多线程编程实例

    确保每个客户端连接结束后都能够正确释放对应的套接字资源,并且在发生异常时也能正确关闭连接。在C#中,可以使用try-catch-finally语句来处理可能出现的异常,并确保在finally块中释放资源。 通过本实例的学习,...

    关闭线程Thread 解决进程中的问题

    这样,主线程就是后台线程,在关闭主程序的时候就会关闭主线程,从而关闭所有线程。 需要注意的是,如果调用 Thread.CurrentThread.Abort() 方法关闭主线程的话,就会抛出 ThreadAbortException 异常。因此,这种...

    用c#实现的电子时钟程序

    当用户关闭窗体时,程序也应该优雅地退出,清理资源并结束运行。 总的来说,实现一个C#电子时钟程序涉及到C#基础、.NET框架的理解,以及Windows Forms控件的使用。通过这个项目,初学者不仅可以掌握C#编程的基本...

    C#对外部exe执行程序的操作

    但是,如果程序中有其他未关闭的窗口或线程,可能不会完全终止进程。 ```csharp // 尝试关闭主窗口 pre.CloseMainWindow(); ``` ### 四、注意事项与最佳实践 1. **资源管理**:确保在不再需要使用外部exe执行...

    C# winform程序退出

    在C# WinForms应用程序开发过程中,程序的退出处理是一项重要的任务。正确的退出策略不仅可以提高程序的稳定性,还能增强用户体验。本文将围绕"C# WinForm程序退出"这一主题展开讨论,详细解析不同退出方法的特点及...

    C#中前台线程和后台线程的区别与联系

    即使所有的主应用程序窗口已经关闭,只要仍有前台线程在执行,进程就会继续存在。前台线程执行完毕后,如果进程内没有其他前台线程,那么进程会随之终止。所有由`new Thread()`创建的线程,默认情况下都是前台线程。...

    C#倒计时小程序

    5. **线程处理**:为了确保倒计时不影响主应用程序的响应,你可能需要在后台线程上运行计时器。这通常通过`BackgroundWorker`组件或异步编程(async/await)实现。 6. **异常处理**:在编写代码时,应考虑到可能...

    C#倒计时程序(含源代码)

    在倒计时开始时,可以启动一个后台线程,当倒计时结束后,通过某种信号(如关闭定时器)来通知主线程结束程序。 5. **源代码分析**: "Countdown"可能是源代码文件的名称,包含主程序类、定时器的初始化和事件处理...

    C# TCP聊天程序

    C# TCP聊天程序是基于C#编程语言实现的网络通信应用程序,主要利用TCP(Transmission Control Protocol)协议进行数据传输。TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议,它确保了数据在互联网上的...

    Visual C#2005程序开发与界面设计秘诀.doc

    本文档主要探讨了在Visual C# 2005中进行程序开发和界面设计的一些关键点,特别是关于生成可执行文件、指定输出位置、设置启动对象以及控制应用程序的关闭和焦点管理。 首先,生成可执行文件(.EXE)有两种方法。第...

    C# 添加启动画面

    最后,主线程再次调用`Join`方法等待`thUI`结束,确保启动窗口关闭后再运行主程序窗口(`frm_Main`)。调用`Application.Run(new frm_Main())`启动主窗口的生命周期。 整个流程可以用UML时序图表示,清晰地描绘出各...

    C#根据窗体标题名字进行关闭窗体

    // 防止程序立即结束,等待一段时间确保窗体关闭 process.WaitForExit(2000); return; } } } Console.WriteLine("没有找到标题为'{0}'的窗体", windowTitle); } ``` 这段代码首先获取了所有运行的进程,...

Global site tag (gtag.js) - Google Analytics