苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 15470|回复: 6

[其他] C#winform界面多线程如何优雅的休眠和停止所有线程

[复制链接]
发表于 2018-12-4 09:08:30 | 显示全部楼层 |阅读模式
由于自身的经验不足,目前了解到休眠的有两种一种是Thread.Sleep,但是会出现winform界面卡死
一种是摘自于网上
public void Delay(int mm)        {
            DateTime current = DateTime.Now;
            while (current.AddMilliseconds(mm) > DateTime.Now)
            {
                Application.DoEvents();
            }
            return;
        }
另一中是退出的做法:

但是这种的话,在窗口关闭的时候定时器又关不了,必须要等时间休眠完成程序才完全退出

目前还了解到一种做法,但是太暴力了, System.Environment.Exit(0);  但是我要问的是怎么保证线程优雅的停止并关闭所有程序


1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2018-12-4 09:26:53 | 显示全部楼层
设置开关,不管是任何强制手法都会破坏内部的程序执行完整性,我的做法是即便是要结束,也要等这一圈跑完了。

比如你的线程要循环50次,正执行到第10次的52%时你要停止,这个时候不是直接停了,而是让程序执行到第10次的100%结束,这样才能保证数据的完整性,详细方法看我的例子

http://www.sufeinet.com/thread-13-1-1.html  直接把结束写到线程里
发表于 2018-12-4 10:08:00 来自移动端 | 显示全部楼层
哪一句是执行到10次完成才结束呢?,看的不是很明白,
发表于 2018-12-4 10:52:22 | 显示全部楼层
在线程外部设置一个变量
[C#] 纯文本查看 复制代码
比如var a=false;

 在线程中写上
if(a)
{
break;
}



然后就是在单击暂停按钮是设置a=true;就行了。

将上面的if(a)放到纯种的循环最后一行即可。


发表于 2018-12-4 16:33:36 | 显示全部楼层
小例子 助你理解
[C#] 纯文本查看 复制代码
        private static Task t1;
        private static CancellationTokenSource tokenSourceT1;
        public Form1()
        {
            InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            tokenSourceT1 = new CancellationTokenSource();
            var token1 = tokenSourceT1.Token;
            t1 = Task.Factory.StartNew(() =>
            {
                try
                {

                    for (int i = 0; i < 10000000000; i++)
                    {
                        if (token1.IsCancellationRequested)
                        {
                            Invoke(new Action(() =>
                            {
                                label10.Text = "已停止";
                            }));
                            t1.Dispose();
                        }
                        else
                        {
                            Invoke(new Action(() =>
                            {
                                this.listBox2.Items.Add(i.ToString());
                            }));
                        }
                    }

                }
                catch (Exception ex)
                {
                    LogHelper.WriteLog(ex.ToString());
                }
            }, token1);
        }
        private void button2_Click(object sender, EventArgs e)
        {
            tokenSourceT1.Cancel();
        }
发表于 2018-12-4 19:43:52 | 显示全部楼层
我只是路过打酱油的。
发表于 2018-12-5 11:57:10 | 显示全部楼层
路过学习下 ,对于线程的东西不是很理解
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-12-26 04:22

© 2014-2021

快速回复 返回顶部 返回列表