`
hewei870723
  • 浏览: 61932 次
  • 性别: 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

分享到:
评论

相关推荐

    关闭窗体后,进程仍然在运行的问题示例代码

    在开发中,遇到这样一个问题: 点击程序主窗体右上角的叉号关闭应用程序后,程序的进程却没有关闭。...2)程序为多线程程序,且在窗体关闭后,仍有线程在工作。 本例将针对此类问题,进行重现并提出解决方案。

    c#进程守护软件-附源码

    26、没有对本程序做单一启动的限制,如果需要只运行一个实例,重新编译主程序中注释掉的一部分代码。对多线程运行的程序,建议设置linecount为100,否则会杀死多余的线程,一个循环周期杀一个,线程数量固定不变的可...

    C# WinForm程序完全退出的问题解决

     只是关闭当前窗口,若不是主窗体的话,是无法退出程序的,另外若有托管线程(非主线程),也无法干净地退出; 2.Application.Exit(); 强制所有消息中止,退出所有的窗体,但是若有托管线程(非主线程),也无法...

    C#全能速查宝典

    《C#全能速查宝典》共分为8章,分别介绍了C#语言基础、Windows窗体及常用控件、Windows高级控件、控件公共属性、方法及事件、数据库开发、文件、数据流与注册表、GDI+绘图技术和C#高级编程,共包含562个C#编程中常用...

    C#编程经验技巧宝典

    4 &lt;br&gt;0009 设置Windows应用程序启动窗体 5 &lt;br&gt;0010 设置Web应用程序起始页 5 &lt;br&gt;0011 如何设置程序的出错窗口 5 &lt;br&gt;0012 如何进行程序调试 6 &lt;br&gt;0013 如何结束不能正常运行的程序 ...

    FTP服务器 C#

    用VS编写的FTP服务器软件,C#网络程序编程学习用。 代码: using System; using System.Collections.Generic; using System.Globalization; using System.IO; using System.Net; using System.Net.Sockets; using ...

    协同拨号器 C# 校园拨号器 2.05 V15

    修复了一下小bug,应某些人要求将CMD窗口封装起来了,以便更好的读取错误信息,当已经连接错误弹出时程序不再自动关闭。 By Zhangzhezh 2010-11-20 V9 2.05 当勾选了自动连接并且已经连接至互联网的情况下程序...

    vc++ 应用源码包_1

    内含各种例子(vc下各种控件的使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、程序控制、进程与线程、字符串、文件读写操作、文件与文件夹属性操作、文件与文件夹系统操作、系统控制操作、程序...

    vc++ 应用源码包_2

    内含各种例子(vc下各种控件的使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、程序控制、进程与线程、字符串、文件读写操作、文件与文件夹属性操作、文件与文件夹系统操作、系统控制操作、程序...

    vc++ 应用源码包_6

    内含各种例子(vc下各种控件的使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、程序控制、进程与线程、字符串、文件读写操作、文件与文件夹属性操作、文件与文件夹系统操作、系统控制操作、程序...

    vc++ 应用源码包_5

    内含各种例子(vc下各种控件的使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、程序控制、进程与线程、字符串、文件读写操作、文件与文件夹属性操作、文件与文件夹系统操作、系统控制操作、程序...

    vc++ 应用源码包_3

    内含各种例子(vc下各种控件的使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、程序控制、进程与线程、字符串、文件读写操作、文件与文件夹属性操作、文件与文件夹系统操作、系统控制操作、程序...

    asp.net知识库

    SqlDataSource WEB控件:当DeleteCommandType= 遭遇 ASP.NET 2.0 只读 TextBox 回发后信息丢失的 bug asp.net2.0:扩展ImageButton控件定制自己需要的功能 ASP.NET 2.0 正式版中无刷新页面的开发(示例代码的补充) ...

    vc++ 开发实例源码包

    内含各种例子(vc下各种控件的使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、程序控制、进程与线程、字符串、文件读写操作、文件与文件夹属性操作、文件与文件夹系统操作、系统控制操作、程序...

Global site tag (gtag.js) - Google Analytics