这似乎和安全与否并无关联.net 的多线程是并行的,各线程有自己的结束方法(自然结束),在主线程也可以结束它(.abort 和.join)
事实上真正给开发人员的这样的控制权是少之又少,老是培养了一堆衣来伸手的家伙。。
你的问题只能怪你没有领晤规格化编程,是流程控制和布置问题

解决方案 »

  1.   

    不好意思,我的确对多线程不熟悉,失礼了哈但是你似乎还没回答我的问题,在结束程序前需要我手动的abort我的endless循环的thread我似乎能够明白,但是,我结束的是一个domain,结束了一个procedure,而我从我上述的情况得知,我的 endless线城并没有被结束,不知道这样说对不对望指教
      

  2.   

    呵呵。。你可以使用IsBackground 来解决你所需要的从属,但我个人并不喜欢用这类从属,线程我们总是希望它是可控的,并且我们程序员是必须逼自己非常明白的知道当程序退出的同时要考虑子线程的退出,并由此引发了子线程的资源清理、连接中断、空出句柄、注销快键等等因素。我的msdn 是2003 的,所以copy url 给你估计用不上,你可以自己找IsBackground资料,简要如下:public bool IsBackground {get; set;}
    说明:获取或设置一个值,该值指示某个线程是否为后台线程。
    属性值:如果此线程是后台线程或即将成为后台线程,则为 true;否则为 false。一个线程或者是后台线程或者是前台线程。后台线程与前台线程类似,区别是后台线程不会防止进程终止。一旦属于某一进程的所有前台线程都终止,公共语言运行库就会通过对任何仍然处于活动状态的后台线程调用 Abort 来结束该进程。
      

  3.   

    希望你不要误会我的意思,我的本意是说要逼我们程序人员自己要明白自己 Must 做什么,而不能依靠它的自动,那样可能会有不少潜在或意外的问题,比如挂的钩子,引发内存泄露,引发socket 没有 close 而再无法连上某FTP等等此类的问题我推荐你使用一个全局变量,由这个 全局变量==true 来放在各子线程的循环内,以判断是否应当中止自己并清理资源和注销钩子,这在多线程的socket 程序里特别重要
      

  4.   

    我的msdn也是2003,实在谢谢你这么详细的回答哈对这个“一个线程或者是后台线程或者是前台线程。后台线程与前台线程类似,区别是后台线程不会防止进程终止。一旦属于某一进程的所有前台线程都终止,公共语言运行库就会通过对任何仍然处于活动状态的后台线程调用 Abort 来结束该进程。”我也认为我应该弄个信号或者简单的全局变量来控制结束worker thread,当时我没注意到这个问题。
    but
    我就是觉得奇怪,为什么vs.net的debug环境没有返回,因为我把form给关闭了,按道理来说应该clr会调用abort,但是我所看到的,它让我觉得并没有这么做。您是老前辈,做个朋友吧
    [email protected]
      

  5.   

    以前遇到过,采用后台运行确实不好,特别是在异步时,还是要能够显示的操纵它,不然有很多异常,我也正解决这些问题,解决后告诉我哦!
    我的Email:[email protected]
      

  6.   

    [email protected] 前辈不敢当,只是入行比较早,碰过的壁多了自然就领会了些东西,特别反感微软的自动和智能,往往会你所奇怪的我可以理解,我个人认为你可能是从VB或delphi 过来的,没有体会到winexe 直接的流程方式在C 或其它比较土的编程方式里,
    所有的程序都是直线型的,由于它的入口点不象vb/delphi 那样直接指定窗体,相反反而要鼓励人们要在自己的main 函数里自己createWindowEx 一个窗体,也就是说,窗体对C而言只是由main 派生的一个子程序而已,并不是象VB那样成为主要。这点我们在C#里也见到了,启动一个窗体实际上是main 函数里的application.run 为该form 建立一个无限消息循环,所以此窗体是否已经载出和主程序是否已经结束并无直接的关系,从理论上来说application.exit 也是一样,它只是结束当前的form 中的无限消息循环简单的说,在一个VS工程建立之后,由编译器将它转化为api(也就是所谓的EXE 现在的EXE事实上都是伪EXE),经常见的比如1,找到入口点main
    2,由main 里的application.run(new form1()); 转化为CreateWindowEx 创建一个窗体,然后在创建后回调form_load 等事件,完成后updateWindow 再回调 form_resize 等事件可以看出,事实上form1 和main 可以理解为二个并行的线程,form1 只是main 的一个派生物,但是main 在application.run 之后被挂起(因为已经出让了消息循环),我们做个实验:static void Main() 
    {
    Application.Run (new Form1());
    MessageBox.Show("ok");
    }运行后是在是 form1 载出(unload)后才出现ok 的MessageBox 的而不是application.run 之后马上出现ok 对话框而多线程并不是是这样,它们都是并行的,彼此都有它们自己的消息循环,所以某form(只是你自己理解成主程序,form 并不是主程序)中结时返回还必须要执行main 下面的命令,并不代表程序就结束了,这时VS也不敢直接帮你将全部子线程中结,必须自己处理其它的线程中止,就算自动帮你abort 也是微软考虑到某些粗心的人或者希望得到简单编程的人士
      

  7.   

    csdn 高手众多,而没分却有研究价值的贴的几乎没人回,真是中国的悲哀
      

  8.   

    hahaha 可能大家没看到吧,这里老是没什么人的,我一般全天在线我是从c++进入计算机的领域的 :)
      

  9.   

    我理解成:把form关闭就等于关闭了主程序,这个是因为在vc中,关闭了一个form,关闭的按钮会象它的父窗口发送一个关闭的消息,然后让父窗口来处理剩下的东西
    我不熟悉在.net,一个form给创建和delete的步骤,但是认为这个过程必须和vc的类似,因为这个消息机制是windows的体制所决定的,所以我虽然没有直接关闭最上层的函数,但是消息机制会这样做
    以至我认为,.net是在消息的映射后,由内部clr对domain中的thread进行检测,来完成所有的资源回收和对子thread的abort对了我+你了哈