怎么结束线程

时间:2022-11-17 22:40:29
        
//上传照片
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();
        }

11 个解决方案

#1


怎么结束线程米人吗?@斑竹,看看嘛

#2


把 threadwcf.Abort();
去掉就可以了,
随后的return就结束线程循环了,不用特意.Abort()

#3


Abort强行终止一个线程

#4


alldrefresh方法里加个try catch

#5


引用 2 楼 gxingmin 的回复:
把 threadwcf.Abort();
去掉就可以了,
随后的return就结束线程循环了,不用特意.Abort()

主要是因为有些时候,如果不结束这个线程,用户会继续上传图片,这样系统就有两个相同线程了,会报“Control.Invoke 必须用于与在独立线程上创建的控件交互。”这个错误 怎么结束线程

#6


引用 5 楼 qiujialongjjj 的回复:
引用 2 楼 gxingmin 的回复:把 threadwcf.Abort();
去掉就可以了,
随后的return就结束线程循环了,不用特意.Abort()
主要是因为有些时候,如果不结束这个线程,用户会继续上传图片,这样系统就有两个相同线程了,会报“Control.Invoke 必须用于与在独立线程上创建的控件交互。”这个错误


你后面不是return了吗?return就结束了线程,所以你这里的.Abort是多此一举

#7


Abort(); 一定抛异常

#8


引用 6 楼 gxingmin 的回复:
引用 5 楼 qiujialongjjj 的回复:引用 2 楼 gxingmin 的回复:把 threadwcf.Abort();
去掉就可以了,
随后的return就结束线程循环了,不用特意.Abort()
主要是因为有些时候,如果不结束这个线程,用户会继续上传图片,这样系统就有两个相同线程了,会报“Control.Invoke 必须用于与在独立线程上创建的控件交……
我return了,然后连续按两次上传图片按钮,报:Control.Invoke 必须用于与在独立线程上创建的控件交互。

主要是这边出现了无线信号不好的情况,有些地方上传速度特慢,程序不能在那傻等,就想上传图片超过一定时间就自动终止,但又不能影响用户其他操作

#9


用Abort方法强行终止一个线程容易引发ThreadAbortException异常,catch处添加调用Thread.ResetAbort来取消中止,Abort()下方添加Thread.Join 方法,直到线程实际停止执行时才返回。

#10


引用 4 楼 hjywyj 的回复:
alldrefresh方法里加个try catch
怎么结束线程报错后会退出程序,汗

#11


用其他方式解决了

#1


怎么结束线程米人吗?@斑竹,看看嘛

#2


把 threadwcf.Abort();
去掉就可以了,
随后的return就结束线程循环了,不用特意.Abort()

#3


Abort强行终止一个线程

#4


alldrefresh方法里加个try catch

#5


引用 2 楼 gxingmin 的回复:
把 threadwcf.Abort();
去掉就可以了,
随后的return就结束线程循环了,不用特意.Abort()

主要是因为有些时候,如果不结束这个线程,用户会继续上传图片,这样系统就有两个相同线程了,会报“Control.Invoke 必须用于与在独立线程上创建的控件交互。”这个错误 怎么结束线程

#6


引用 5 楼 qiujialongjjj 的回复:
引用 2 楼 gxingmin 的回复:把 threadwcf.Abort();
去掉就可以了,
随后的return就结束线程循环了,不用特意.Abort()
主要是因为有些时候,如果不结束这个线程,用户会继续上传图片,这样系统就有两个相同线程了,会报“Control.Invoke 必须用于与在独立线程上创建的控件交互。”这个错误


你后面不是return了吗?return就结束了线程,所以你这里的.Abort是多此一举

#7


Abort(); 一定抛异常

#8


引用 6 楼 gxingmin 的回复:
引用 5 楼 qiujialongjjj 的回复:引用 2 楼 gxingmin 的回复:把 threadwcf.Abort();
去掉就可以了,
随后的return就结束线程循环了,不用特意.Abort()
主要是因为有些时候,如果不结束这个线程,用户会继续上传图片,这样系统就有两个相同线程了,会报“Control.Invoke 必须用于与在独立线程上创建的控件交……
我return了,然后连续按两次上传图片按钮,报:Control.Invoke 必须用于与在独立线程上创建的控件交互。

主要是这边出现了无线信号不好的情况,有些地方上传速度特慢,程序不能在那傻等,就想上传图片超过一定时间就自动终止,但又不能影响用户其他操作

#9


用Abort方法强行终止一个线程容易引发ThreadAbortException异常,catch处添加调用Thread.ResetAbort来取消中止,Abort()下方添加Thread.Join 方法,直到线程实际停止执行时才返回。

#10


引用 4 楼 hjywyj 的回复:
alldrefresh方法里加个try catch
怎么结束线程报错后会退出程序,汗

#11


用其他方式解决了