本文为大家分享了C#多线程之线程控制,供大家参考,具体内容如下

方案一:
调用线程控制方法.启动:Thread.Start();停止:Thread.Abort();暂停:Thread.Suspend();继续:Thread.Resume();
private void btn_Start_Click(object sender, EventArgs e)
{
mThread.Start(); // 开始
}
private void btn_Stop_Click(object sender, EventArgs e)
{
mThread.Abort(); // 终止
}
private void btn_Suspend_Click(object sender, EventArgs e)
{
mThread.Suspend(); // 暂停
}
private void btn_Resume_Click(object sender, EventArgs e)
{
mThread.Resume(); // 继续
}
线程定义为:
mThread = new Thread(() =>
{
try
{
for (int j = 0; j < 20; j++)
{
int vSum = 0;
this.textBox1.Text += "--->";
for (int i = 0; i < 100000000; i++)
{
if (i % 2 == 0)
{
vSum += i;
}
else
{
vSum -= i;
}
}
this.textBox1.Text += string.Format("{0} => vSum = {1}\r\n", DateTime.Now.ToString(), vSum);
Thread.Sleep(1000);
}
}
catch (ThreadAbortException ex)
{
Console.WriteLine("ThreadAbortException:{0}", ex.Message);
}
});
值得注意的是: 通过 Thread.Abort() 停下来的线程(或自行运行结束的线程),都无法直接通过 Thread.Start() 方法再次启动,必须重新创建一个线程启动。
所以,“开始按钮”事件应为:
private void btn_Start_Click(object sender, EventArgs e)
{
// 定义线程
mThread = new Thread(() => // Lambda 表达式
{
try
{
for (int j = 0; j < 20; j++)
{
int vSum = 0;
this.textBox1.Text += "--->";
for (int i = 0; i < 100000000; i++)
{
if (i % 2 == 0)
{
vSum += i;
}
else
{
vSum -= i;
}
}
this.textBox1.Text += string.Format("{0} => vSum = {1}\r\n", DateTime.Now.ToString(), vSum);
Thread.Sleep(1000);
}
}
catch (ThreadAbortException ex)
{
Console.WriteLine("ThreadAbortException:{0}", ex.Message);
}
});
mThread.Start(); // 开始
}
此外,对于 Thread.Suspend() 和 Thread.Resume() 方法,微软已经将其标记为过时:
Thread.Suspend has been deprecated. Please use other classes in System.Threading, such as Monitor, Mutex, Event, and Semaphore, to synchronize Threads or protect resources. http://go.microsoft.com/fwlink/?linkid=14202(Thread.Suspend 已被否决。请使用系统中的其他类线程,如监视器、互斥体、事件和信号量,以同步线程或保护资源。http://go.microsoft.com/fwlink/?linkid=14202)
因为,无法判断当前挂起线程时它正在执行什么代码。如果在安全权限评估期间挂起持有锁的线程,则 AppDoamin 中的其它线程可能被阻止。如果在线程正执行构造函数时挂起它,则 AppDomain 中尝试使用该类的其它线程将被阻止。这样容易发生死锁。
方案二:
在 线程运行过程中 适当的位置(如某个完整的功能/命令后)判断是否要继续线程,再决定线程的命运。
1.定义一个全局变量:
int mTdFlag = 0; // 1:正常运行;2:暂停;3:停止
2. 定义一个判断方法:
bool WaitForContinue()
{
if (this.mTdFlag == 3)
{
return false; // 返回false,线程停止
}
else if (this.mTdFlag == 2)
{
while (mTdFlag != 1)
{
Thread.Sleep(200); // 假暂停;停顿时间越短,越灵敏
if (this.mTdFlag == 3)
{
return false; // 返回false,线程停止
}
}
}
return true; // 返回true,线程继续
}
3.修改 控制命令 事件:
private void btn_Stop_Click(object sender, EventArgs e)
{
this.mTdFlag = 3;
//mThread.Abort(); // 终止
}
private void btn_Suspend_Click(object sender, EventArgs e)
{
this.mTdFlag = 2;
//mThread.Suspend(); // 暂停
}
private void btn_Resume_Click(object sender, EventArgs e)
{
this.mTdFlag = 1;
//mThread.Resume(); // 继续
}
4.在线程运行过程中适当的位置,判断线程是否继续
mThread = new Thread(() =>
{
try
{
for (int j = 0; j < 20; j++)
{
int vSum = 0;
this.textBox1.Text += "--->";
for (int i = 0; i < 100000000; i++)
{
if (i % 2 == 0)
{
vSum += i;
}
else
{
vSum -= i;
}
if (i % 10000000 == 0)
{
this.textBox1.Text += ".";
}
if (!WaitForContinue()) // 返回 false 则,停止
{
break;
//return;
}
}
this.textBox1.Text += string.Format("{0} => vSum = {1}\r\n", DateTime.Now.ToString(), vSum);
if (!WaitForContinue()) // 返回 false 则,停止
{
break;
// return;
}
Thread.Sleep(1000);
}
}
catch (ThreadAbortException ex)
{
Console.WriteLine("ThreadAbortException:{0}", ex.Message);
this.textBox1.Text += ex.Message + "...";
}
finally
{
this.textBox1.Text += "线程已结束";
}
});
在窗体中,解决跨线程访问问题:在窗体构造函数中添加代码: Control.CheckForIllegalCrossThreadCalls = false;
# C#
# 多线程
# 线程控制
# C#多线程基础知识汇总
# C# 多线程编程技术基础知识入门
# 基于C#实现的轻量级多线程队列图文详解
# C#中的多线程小试牛刀
# C#中的多线程超时处理实践方案
# C#多线程之Semaphore用法详解
# C# 文件上传下载(Excel导入
# 多线程下载)功能的实现代码
# C#多线程及同步示例简析
# C#多线程之Thread类详解
# 深入了解c#多线程编程
# 挂起
# 死锁
# 过程中
# 的是
# 信号量
# 已被
# 将其
# 微软
# 请使用
# 将被
# 停下来
# 大家分享
# 具体内容
# 正常运行
# 判断是否
# 全局变量
# 互斥
# gt
# btn_Resume_Click
相关文章:
南宁网站建设制作定制,南宁网站建设可以定制吗?
C++时间戳转换成日期时间的步骤和示例代码
湖州网站制作公司有哪些,浙江中蓝新能源公司官网?
建站上传速度慢?如何优化加速网站加载效率?
如何用美橙互联一键搭建多站合一网站?
黑客入侵网站服务器的常见手法有哪些?
网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?
建站之星安装路径如何正确选择及配置?
建站主机选购指南:核心配置优化与品牌推荐方案
家庭建站与云服务器建站,如何选择更优?
香港服务器网站生成指南:免费资源整合与高速稳定配置方案
专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?
武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?
香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧
网站按钮制作软件,如何实现网页中按钮的自动点击?
已有域名如何免费搭建网站?
如何配置WinSCP新建站点的密钥验证步骤?
建站之星如何快速解决建站难题?
如何构建满足综合性能需求的优质建站方案?
简易网站制作视频教程,使用记事本编写一个简单的网页html文件?
建站之星安装后如何自定义网站颜色与字体?
如何通过商城免费建站系统源码自定义网站主题?
官网网站制作腾讯审核要多久,联想路由器newifi官网
如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?
Python文件管理规范_工程实践说明【指导】
一键网站制作软件,义乌购一件代发流程?
详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)
建站之星如何取消后台验证码生成?
深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?
建站之星体验版:智能建站系统+响应式设计,多端适配快速建站
公众号网站制作网页,微信公众号怎么制作?
c++ stringstream用法详解_c++字符串与数字转换利器
宝塔新建站点报错如何解决?
,制作一个手机app网站要多少钱?
上海网站制作网页,上海本地的生活网站有哪些?最好包括生活的各个方面的?
如何通过FTP空间快速搭建安全高效网站?
定制建站模板如何实现SEO优化与智能系统配置?18字教程
建站主机无法访问?如何排查域名与服务器问题
建站之星会员如何解锁更多建站功能?
,怎么用自己头像做动态表情包?
广东专业制作网站有哪些,广东省能源集团有限公司官网?
制作电商网页,电商供应链怎么做?
微网站制作教程,不会写代码,不会编程,怎么样建自己的网站?
如何破解联通资金短缺导致的基站建设难题?
Python如何创建带属性的XML节点
音乐网站服务器如何优化API响应速度?
如何通过VPS建站无需域名直接访问?
c# F# 的 MailboxProcessor 和 C# 的 Actor 模型
子杰智能建站系统|零代码开发与AI生成SEO优化指南
如何彻底删除建站之星生成的Banner?
*请认真填写需求信息,我们会在24小时内与您取得联系。