/// <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)
- 魅族|一年后见!索尼+魅族,又让我多了个捡漏产品
- 索尼|60Hz屏手机卖3500元!老外评索尼Xperia 10 IV:续航惊人 价格太贵
- 索尼Xperia|红米官宣新机!“千元神机”?天玑8000+512G!
- 索尼Xperia|国产有对手了,索尼推出首款5000mAh+4nm新机,12G+512G要卖爆
- 索尼|开机BIOS语言提示
- 索尼Xperia|更多人气功能即将上线 魅族Flyme携手索尼Xperia持续深耕系统体验
- 索尼Xperia|万物皆可盘丨带上Xperia Touch,来一场炫酷屌炸天的操作吧!
- 索尼Xperia|关键参数基本确定,iPhone14Pro真是大赢家
- 索尼Xperia|索尼发布新一代微单手机 Xperia 1 IV
- 2022年5月11日|索尼xperia1iv,为什么每年都卖不好?