C#两种进程暂停和继续的方法 2021-02-16

C#两种进程暂停和继续的方法

方法一

可以使用Thread.Suspend和Thread.Resume这两个方法。

namespace ThreadSuspended
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
           
        }

        
        
        
        private  void text()
        {
            for (int i = 0; i < 100000; i++)
            {
                Invoke(new Action(() => txt_Count.Text = i.ToString()));
                //txt_Count.Text = i.ToString();
            }
        }

        private Thread th;
        private void Btn_Start_Click(object sender, EventArgs e)
        { 
            th = new Thread(new ThreadStart(text));
            th.Start();
            th.IsBackground = true;//使th为后台线程在关闭Form1时后台线程一起关闭,如果前台线程则不被关闭引发错误
        }

        private void Btn_Pause_Click(object sender, EventArgs e)//暂停按钮
        {
            if (th.ThreadState != ThreadState.Suspended)//如果线程没有挂起
            {
                //挂起线程
                th.Suspend();
            }
        }

        private void Btn_Continue_Click(object sender, EventArgs e)//继续按钮
        {
            if (th != null && th.ThreadState != ThreadState.Running )
            {
                //继续运行
                th.Resume();
            }
        }
    }
}

如图(一)所示
在这里插入图片描述
这里面要注意的是调用文本框txt_Count必须要使用委托的方法Invoke(new Action(() => txt_Count.Text = i.ToString()));
开始控件名称: btn_Start 开始事件:Btn_Start_Click(object sender, EventArgs e)
暂停控件名称:btn_Pause 暂停事件:Btn_Pause_Click(object sender, EventArgs e)
继续控件名称:btn_Continue 继续事件:Btn_Continue_Click(object sender, EventArgs e)

方法二

使用ManualResetEvent, ManualResetEvent 是一个类它会通知一个或多个正在等待的线程已发生事件。 此类不能被继承。

namespace ThreadSuspended
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
           
        }


        ManualResetEvent mre = new ManualResetEvent(true);

        private void text()
        {
            for (int i = 0; i < 100000; i++)
            {
                mre.WaitOne();
                Invoke(new Action(() => txt_Count.Text = i.ToString()));
                //txt_Count.Text = i.ToString();
            }
        }

        private Thread th;
        private void Btn_Start_Click(object sender, EventArgs e)
        {

            th = new Thread(new ThreadStart(text));
            th.Start();
            th.IsBackground = true;//使th为后台线程在关闭Form1时后台线程一起关闭,如果前台线程则不被关闭引发错误
        }

        private void Btn_Pause_Click(object sender, EventArgs e)//暂停按钮
        {
            mre.Reset();
        }

        private void Btn_Continue_Click(object sender, EventArgs e)//继续按钮
        {
            mre.Set();
        }
    }
}

效果如图一所示结果一样,与方法一不一样的是在for循环中加入mre.WaitOne();这段代码的作用就是

// 摘要:
       //     阻止当前线程,直到当前 System.Threading.WaitHandle 收到信号。
       //
       // 返回结果:
       //     如果当前实例收到信号,则为 true。 如果当前实例永远收不到信号,则 System.Threading.WaitHandle.WaitOne(System.Int32,System.Boolean)
       //     永不返回。
       //
       // 异常:
       //   T:System.ObjectDisposedException:
       //     当前实例已被释放。
       //
       //   T:System.Threading.AbandonedMutexException:
       //     线程退出时未释放互斥体,等待过程已终止。 在 Windows 98 或 Windows Millennium Edition 中不引发此异常。
       //
       //   T:System.InvalidOperationException:
       //     当前实例是另一个应用程序域中的 System.Threading.WaitHandle 的透明代理。
  • 2
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杏雨1969

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值