多线程的启动停止
线程的启动停止,从.Net Framework 4.5开始,Task提供了一个叫CancellationTokenSource的对象,可以使用它来对多线程的启停进行控制。
首先,我们做一个线程任务,这个任务很简单,只是不断操作某个变量,每0.1秒加1,到一定值之后,重置为0,然后将这个值显示在界面上,界面如下所示:
所以任务方法如下:
/// <summary>
/// 多线程执行方法
/// </summary>
private void TaskMethod()
{
while (!cts.IsCancellationRequested)
{
CurrentValue++;
if (CurrentValue == 200)
{
CurrentValue = 0;
}
Thread.Sleep(100);
}
}
我们可以看到在方法里调用了一个cts对象,这个对象就是CancellationTokenSource的对象,因此我们需要创建一个CancellationTokenSource对象cts:
/// <summary>
/// 线程启停控制
/// </summary>
private CancellationTokenSource cts;
然后在启动线程按钮的事件里,编写代码如下:
private void btn_Start_Click(object sender, EventArgs e)
{
cts = new CancellationTokenSource();
Task.Run(() =>
{
TaskMethod();
}, cts.Token);
}
停止线程按钮的事件里,只需要调用cts的Cancel方法即可:
private void btn_Stop_Click(object sender, EventArgs e)
{
cts.Cancel();
CurrentValue = 0;
}
其实,说白了,就是通过cts来控制cts的IsCancellationRequested属性,进而实现多线程的控制。
多线程的暂停继续
多线程的暂停继续,.NET为我们提供了另外一个对象——ManualResetEvent,这个对象会有一个值,这个值是布尔类型,就像一个门闸一样,True是打开门闸,False是关闭门闸,所以想要暂停多线程就调用这个对象的Reset方法,想要继续多线程就调用这个对象的Set方法,使用非常简单。
首先我们创建一下这个对象,可以通过构造方法,给这个对象赋初始值,我这里为True,这样就能直接运行,不会阻塞。
/// <summary>
/// 线程暂停控制,默认开启
/// </summary>
private ManualResetEvent manual = new ManualResetEvent(true);
但是如果希望这个对象与多线程有所联系,必须要在多线程的方法里体现这个对象的作用,这个是调用这个对象的WaitOne方法,表示在调用的地方阻塞住,通过判断True或者False来决定是否继续执行,就像大家开车过高速收费站一样,即使现在普遍采用ETC了,在入口也需要减速,有一个ETC识别的过程,识别成功才会抬杆,识别识别,杆子是不会自动抬起的,这个是一样的道理。
所以线程执行代码如下:
/// <summary>
/// 多线程执行方法
/// </summary>
private void TaskMethod()
{
while (!cts.IsCancellationRequested)
{
manual.WaitOne();
CurrentValue++;
if (CurrentValue == 200)
{
CurrentValue = 0;
}
Thread.Sleep(100);
}
}
对比一下,其实就是加了一个manual.WaitOne()。
线程暂停代码:
private void btn_Pause_Click(object sender, EventArgs e)
{
manual.Reset();
}
线程继续代码:
private void btn_Continue_Click(object sender, EventArgs e)
{
manual.Set();
}
AutoResetEvent
AutoResetEvent和ManualResetEvent的用法非常相似,区别在于一个是手动,一个是自动,AutoResetEvent会在置位之后自动复位,这样体现在多线程里,就是会只执行一次,就像大家进小区一样,如果有10辆车在排队,这时候如果自动模式,每次只能进一辆车,如果是手动模式,可以由保安控制门闸打开,等10辆车都进去之后,再由保安将门闸关注。
标签:CurrentValue,cts,对象,恢复,private,线程,暂停,多线程 From: https://www.cnblogs.com/hanzq/p/16924204.html