首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

如何结束线程

2013-02-04 
怎么结束线程//上传照片private void btnSave_Click(object sender, EventArgs e){try{SysInfo si new S

怎么结束线程

        
//上传照片
private void btnSave_Click(object sender, EventArgs e)
        {
            try
            {
                SysInfo si = new SysInfo();
                this.statusBar1.Text = Status.PicSave;
                threadwcf = new Thread(new ThreadStart(wcfrun));//上传照片线程
                threadtime = new Thread(new ThreadStart(timerun));//计时线程
                threadwcf.IsBackground = true;
                threadwcf.Start();
                threadtime.Start();
            }
            catch
            {
                this.statusBar1.Text = Status.wlanFail;
            }
        }

        private void wcfrun()
        {
            try
            {
                FTPClient d = new FTPClient(FtpInfo.ip, FtpInfo.ml, FtpInfo.yhm, FtpInfo.mm, FtpInfo.dk);
                d.upload(Path.TemporaryPath, "*");
                if (InvokeRequired)
                {
                    Invoke(new NewWcf(enduploadpic));
                }
            }
            catch (Exception ex)
            {
                this.statusBar1.Text = Status.wlanFail;
            }
        }

        //如果超过2秒,则结束上传照片线程
        private void timerun()
        {
            for (var i = 1; i < 10; i++)
            {


                if (i > 2)
                {
                    if (InvokeRequired)
                    {
                        Invoke(new NewWcf(alldrefresh));
                    }
                    return;
                }
                Thread.Sleep(1000);
            }
        }

        //这边会出问题
        private void alldrefresh()
        {
            //当超过两秒的时候,结束线程报错了
            //ThreadAbortException
            //这边貌似结束了线程,程序会关闭,怎么能不关闭程序呢?
            threadwcf.Abort();
            this.statusBar1.Text = Status.wlanTimeOut;
        }

        private void enduploadpic()
        {
            picCount.Clear();
            this.statusBar1.Text = Status.endSave;
            threadtime.Abort();
            Application.DoEvents();
        }


[解决办法]
把 threadwcf.Abort();
去掉就可以了,
随后的return就结束线程循环了,不用特意.Abort()
[解决办法]
Abort强行终止一个线程
[解决办法]
alldrefresh方法里加个try catch
[解决办法]
引用:
引用:把 threadwcf.Abort();
去掉就可以了,
随后的return就结束线程循环了,不用特意.Abort()
主要是因为有些时候,如果不结束这个线程,用户会继续上传图片,这样系统就有两个相同线程了,会报“Control.Invoke 必须用于与在独立线程上创建的控件交互。”这个错误


你后面不是return了吗?return就结束了线程,所以你这里的.Abort是多此一举
[解决办法]
Abort(); 一定抛异常
[解决办法]
用Abort方法强行终止一个线程容易引发ThreadAbortException异常,catch处添加调用Thread.ResetAbort来取消中止,Abort()下方添加Thread.Join 方法,直到线程实际停止执行时才返回。

热点排行