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 = ; j < ; j++)
{
int vSum = ;
this.textBox1.Text += "--->";
for (int i = ; i < ; i++)
{
if (i % == )
{
vSum += i;
}
else
{
vSum -= i;
}
}
this.textBox1.Text += string.Format("{0} => vSum = {1}\r\n", DateTime.Now.ToString(), vSum);
Thread.Sleep();
}
}
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 = ; j < ; j++)
{
int vSum = ;
this.textBox1.Text += "--->";
for (int i = ; i < ; i++)
{
if (i % == )
{
vSum += i;
}
else
{
vSum -= i;
}
}
this.textBox1.Text += string.Format("{0} => vSum = {1}\r\n", DateTime.Now.ToString(), vSum);
Thread.Sleep();
}
}
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 == )
{
return false; // 返回false,线程停止
}
else if (this.mTdFlag == )
{
while (mTdFlag != )
{
Thread.Sleep(); // 假暂停;停顿时间越短,越灵敏
if (this.mTdFlag == )
{
return false; // 返回false,线程停止
}
}
}
return true; // 返回true,线程继续
}
3.修改 控制命令 事件:
private void btn_Stop_Click(object sender, EventArgs e)
{
this.mTdFlag = ;
//mThread.Abort(); // 终止
} private void btn_Suspend_Click(object sender, EventArgs e)
{
this.mTdFlag = ;
//mThread.Suspend(); // 暂停
} private void btn_Resume_Click(object sender, EventArgs e)
{
this.mTdFlag = ;
//mThread.Resume(); // 继续
}
4.在线程运行过程中适当的位置,判断线程是否继续
mThread = new Thread(() =>
{
try
{
for (int j = ; j < ; j++)
{
int vSum = ;
this.textBox1.Text += "--->";
for (int i = ; i < ; i++)
{
if (i % == )
{
vSum += i;
}
else
{
vSum -= i;
}
if (i % == )
{
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();
}
}
catch (ThreadAbortException ex)
{
Console.WriteLine("ThreadAbortException:{0}", ex.Message);
this.textBox1.Text += ex.Message + "...";
}
finally
{
this.textBox1.Text += "线程已结束";
}
});
在窗体中,解决跨线程访问问题:在窗体构造函数中添加代码: Control.CheckForIllegalCrossThreadCalls = false;
[http://www.cnblogs.com/CUIT-DX037/]
C# 多线程之线程控制的更多相关文章
- Java多线程开发系列之四:玩转多线程(线程的控制2)
在上节的线程控制(详情点击这里)中,我们讲解了线程的等待join().守护线程.本节我们将会把剩下的线程控制内容一并讲完,主要内容有线程的睡眠.让步.优先级.挂起和恢复.停止等. 废话不多说,我们直接 ...
- Java多线程开发系列之四:玩转多线程(线程的控制1)
在前文中我们已经学习了:线程的基本情况.如何创建多线程.线程的生命周期.利用已有知识我们已经可以写出如何利用多线程处理大量任务这样简单的程序.但是当应用场景复杂时,我们还需要从管理控制入手,更好的操纵 ...
- Win32多线程编程(2) — 线程控制
Win32线程控制只有是围绕线程这一内核对象的创建.挂起.恢复.终结以及通信等操作,这些操作都依赖于Win32操作系统提供的一组API和具体编译器的C运行时库函数.本篇围绕这些操作接口介绍在Windo ...
- Java多线程之线程的控制
Java多线程之线程的控制 线程中的7 种非常重要的状态: 初始New.可运行Runnable.运行Running.阻塞Blocked.锁池lock_pool.等待队列wait_pool.结束Dea ...
- java多线程(六)线程控制类
1. 多线程控制类 为了保证多线程的三个特性,Java引入了很多线程控制机制,下面介绍其中常用的几种: l ThreadLocal l 原子类 l Lock类 l Volatile关键字 ...
- Java多线程学习(四)---控制线程
控制线程 摘要: Java的线程支持提供了一些便捷的工具方法,通过这些便捷的工具方法可以很好地控制线程的执行 1. join线程控制,让一个线程等待另一个线程完成的方法 2. 后台线程,又称为守护线程 ...
- C#多线程之线程同步篇3
在上一篇C#多线程之线程同步篇2中,我们主要学习了AutoResetEvent构造.ManualResetEventSlim构造和CountdownEvent构造,在这一篇中,我们将学习Barrier ...
- Java并发1——线程创建、启动、生命周期与线程控制
内容提要: 线程与进程 为什么要使用多线程/进程?线程与进程的区别?线程对比进程的优势?Java中有多进程吗? 线程的创建与启动 线程的创建有哪几种方式?它们之间有什么区别? 线程的生命周期与线程控制 ...
- 06_Java多线程、线程间通信
1. 线程的概念 1.1多进程与多线程 进程:一个正在执行的程序.每个进程执行都有一个执行顺序,该顺序是一个执行路径,或叫一个控制单元. 一个进程至少有一个线程. 线程:就是进程中的一个独立 ...
随机推荐
- Centos7 忘记密码的情况下,修改root或其他用户密码
转载:https://blog.csdn.net/wcy00q/article/details/70570043 应用场景 linux管理员忘记root密码,需要进行找回操作. 注意事项:本文基于ce ...
- 3.JasperReports学习笔记3-在浏览器生成PDF文件
转自:https://i.cnblogs.com/posts?categoryid=921197 一.新建web工程,导入jasperreports所需的jar包,配置web.xml <serv ...
- python 基础 字典 小例子
统计单词次数 作为字典存储 cotent = "who have an apple apple is free free is money you know" result = { ...
- Nios程序烧写到EPCS方法 - 第1页 - asus119's Blog - EDN China电子设计技术
Nios程序烧写到EPCS方法 - 第1页 - asus119's Blog - EDN China电子设计技术 这里主要是针对EP3C系列FPGA的Nios程序固化到EPCS中的方法做简要说明.硬件 ...
- 积累遇到过的linux终端操作指令
mkdir mkdir命令是常用的命令,用来建立空目录,它还有2个常用参数: -m, --mode=模式 设定权限<模式> (类似 chmod) -p, --parents 需要时创建上层 ...
- MySql中的锁(表锁,行锁)
锁是计算机协调多个进程或春线程并发访问某一资源的机制.在数据库中,除传统的计算资源(CPU,RAM,I/O)的争用之外,数据也是一种工许多用户共享的资源.如何保证数据并发访问的一致性,有效性是所有数据 ...
- 29.极具破坏力的DDoS:浅析其攻击及防御
一.DDoS的概念 1.什么是“DDoS”? DDoS:Distributed Denial of Service(分布式拒绝服务)攻击指借助于客户/服务器技术,将多个计算机联合起来作为攻击平台,对一 ...
- 整数划分——真正的递归经典例题(NYOJ——90)
先注明学习博客的地址:(http://www.cnblogs.com/hoodlum1980/archive/2008/10/11/1308493.html) 题目描述:任何正整数n都可以写成n=n1 ...
- 20170527关于Thingking in Java
由于工作上的需求,要开始学习Android开发,所以先开始看一些Java方面的知识.学习从Thingking in Java开始,看了一下第一张,感觉真的是一本好书,希望自己努力把他看完,加油! 第一 ...
- 浅谈js模块加载方式(初级)
1.简介: 前端模块化开发日渐鼎盛,如何将零散的插件或者是普通的js脚本文件统一管理及引用,是众多开发者共同的目标.本人是从事.net开发的,最近对前端的一些东西特别的感兴趣,也会尝试的夹杂一点自己 ...