• 黑马程序员 关于c# windows窗体关闭时线程未能完全退出问题(专题一)


       

    <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IO开发S</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>

    前几天在用c#  windows窗体编写坦克大战游戏时曾用过线程,在程序退出后会发现还有线程在后台运行(打开任务管理器可以看到) 现在用一部分代码来表达:            public Form1()             {             InitializeComponent();                    IPEndPoint ipendpoint=new IPEndPoint(IPAddress.Parse(txtIP.Text),int.Parse(txtPort.Text));              socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);             socket.Bind(ipendpoint);             socket.Listen(10);                               }         }

    上边的代码无需看懂;

      接下来我再刚才的Form1()中添加如下代码:

        即:   public Form1()             {                  。。。。。。。

                            //一下为添加代码

                               Thread threadlisten = new Thread(new ThreadStart(ThreadListen));                            threadlisten.Start();             }

    当然程序中代码不仅仅如此,在此仅为说明问题才列出以上代码。

     之后运行窗体程序后,关闭窗体。

    在任务管理器中发现刚才的程序线程还在后台运行(如果你现在在运行该程序,vs就会报错提示有线程正在访问)

    为什么会出现这个问题?

      难道是关闭时没写线程销毁。

      所以我又在程序中添加了如下代码:

             this.Dispose();

        或者

            Application.Exit();

    等代码,结果于事无补。

    怎么解决哪?

      那么就要分析线程的优先级以及线程的销毁周期

    我们都知道程序退出的依据是当前程序的所有前台线程都退出(记住是前台线程),在一个正常的windows程序下,我们没有用线程,所以在退出时,

    直接退出UI线程,即窗体就退出了当前程序;然而,我们一旦在程序中附加线程,那么默认情况下该线程也为前台线程,所以,我们在退出Ui(窗体)

    时,并没有退出附加线程。

        所以我们想办法把我们附加的线程变为后台线程即可。

    在我们上面编的程序中加上threadlisten.IsBackground=True;

                                   public Form1()            

                                    {           

                                         。。。。。。。

                              //一下为添加代码

                               Thread threadlisten = new Thread(new ThreadStart(ThreadListen));          

                                      threadlisten.IsBackground=True;

                                 threadlisten.Start();           

                               }

    之后就可以正常退出。

    <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>

  • 相关阅读:
    jqgard改变单元格后重新定值(事件和弹窗)
    js多个input框赋相同值
    查看PHP已安装拓展的指令
    PHP重新安装zlib拓展,处理PHP Startup: Invalid library (maybe not a PHP library) 'zlib.so' in Unknown
    php拓展安装报错:PHP Startup: Invalid library (maybe not a PHP library) 'zlib.so' in Unknown
    Composer提示:Installation Failed, Reverting ./Composer.Json To Its Original Content.错误的解决办法
    SQL Server序列号的获取
    一步步开发Windows服务(Windows Service)[转]
    HTML+CSS+JS实现的贪吃球小游戏【转】
    自制一个滚动条
  • 原文地址:https://www.cnblogs.com/lingzeng/p/3170724.html
Copyright © 2020-2023  润新知