索尼Xperia|上位机开发——多线程启动停止暂停继续( 二 )


/// <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)