打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
C#两种进程暂停和继续的方法 2021

  • 方法一
  • 方法二

方法一

可以使用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 的透明代理。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
.NET中的三种Timer的区别和用法
c# 中定时器的用法
@开发者,一文搞懂什么是 C# 计时器!
C#Form打开一个新窗口的同时关闭这个窗体
ASP.NET(C#) 定时执行一段代码
模拟C#按钮事件触发过程
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服