
C#两种进程暂停和继续的方法 2021-02-16
方法一:使用
方法二:使用
发布日期:2021-05-10 23:37:17
浏览次数:32
分类:精选文章
本文共 2711 字,大约阅读时间需要 9 分钟。
C# 启用和暂停进程的两种方法
在编程中,进程的暂停和继续是一个常见但关键的操作。对于C#开发者而言,有两种主要的方法可以实现这一功能。以下是两种方法的详细说明和代码示例。
方法一:使用 Thread.Suspend
和 Thread.Resume
这种方法通过线程的挂起和恢复来实现进程的暂停和继续。这是C#中最直接的方式之一。
工作原理
Thread.Suspend()
方法将当前线程挂起,转移线程控制权给其他线程或应用程序。Thread.Resume()
方法恢复被挂起的线程,使其继续执行。
这种方法的优点是简单易用,适合处理单线程环境中的进程管理。
代码示例
using System;using System.Threading;namespace ThreadSuspended{ public partial class Form1 : Form { private Thread th; private void text() { for (int i = 0; i < 100000; i++) { Invoke(new Action(() => txt_Count.Text = i.ToString())); } } private void Btn_Start_Click(object sender, EventArgs e) { th = new Thread(new ThreadStart(text)); th.Start(); th.IsBackground = true; } 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(); } } }}
要点
- Invoke方法用于在UI线程中更新文本框内容,避免跨线程操作引发异常。
th.IsBackground = true;
确保在窗口关闭时,后台线程也随之终止。- 代码中使用
ThreadState
属性检查当前线程的状态,确保操作仅在适当的时机执行。
方法二:使用 ManualResetEvent
这种方法利用了信号量(Event)来实现进程的控制,适合多线程或多个信号的场景。
工作原理
ManualResetEvent
初始化为设置状态(Signaled),线程等待后被唤醒。- 当需要暂停线程时,调用
mre.Reset();
将信号量重置为未设置。 - 当需要恢复线程时,调用
mre.Set();
将信号量设置为已设置。
这种方法的优势在于可以更灵活地控制线程的生命周期。
代码示例
using System;using System.Threading;namespace ThreadSuspended{ public partial class Form1 : Form { 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())); } } private void Btn_Start_Click(object sender, EventArgs e) { th = new Thread(new ThreadStart(text)); th.Start(); th.IsBackground = true; } private void Btn_Pause_Click(object sender, EventArgs e) { mre.Reset(); } private void Btn_Continue_Click(object sender, EventArgs e) { mre.Set(); } }}
要点
mre.WaitOne();
字段阻止当前线程,直到收到信号。mre.Reset();
用于暂停线程。mre.Set();
用于继续线程。
可能的混淆点
-
哪种方法更适合?
- 如果线程简单且仅需暂停/继续,建议使用
Thread.Suspend
和Thread.Resume
。 - 如果需要更高级的信号控制,尤其是在多线程环境中,使用
ManualResetEvent
更为合适。
- 如果线程简单且仅需暂停/继续,建议使用
-
线程状态的检查
- 在方法一中,检查
ThreadState
保证操作的有效性。 - 在方法二中,使用信号量机制确保线程的等待和唤醒。
- 在方法一中,检查
总结
这两种方法都可以实现进程的暂停和继续,但在具体场景中选择哪种方式取决于你的需求和线程复杂度。
发表评论
最新留言
能坚持,总会有不一样的收获!
[***.219.124.196]2025年04月16日 00时20分41秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
【专题3:电子工程师 之 上位机】 之 【46.QT音频接口】
2019-03-09
一文理解设计模式--命令模式(Command)
2019-03-09
VTK:可视化之RandomProbe
2019-03-09
block多队列分析 - 2. block多队列的初始化
2019-03-09
Java时间
2019-03-09
不编译只打包system或者vendor image命令
2019-03-09
【编程】C语言入门:1到 100 的所有整数中出现多少个数字9
2019-03-09
flink启动(二)
2019-03-09
pair的用法
2019-03-09
Flex 布局的自适应子项内容过长导致其被撑大问题
2019-03-09
PL/SQL 动态Sql拼接where条件
2019-03-09
Lua-table 一种更少访问的安全取值方式
2019-03-09
虚函数
2019-03-09
【自学Flutter】4.1 Material Design字体图标的使用(icon)
2019-03-09
【换行符】什么时候用cin.get()吃掉输入流中的换行符
2019-03-09
【二叉树】已知后序与中序求先序
2019-03-09
广东外语外贸大学第三届网络安全大赛Writeup
2019-03-09
SpringBoot使用RedisTemplate简单操作Redis的五种数据类型
2019-03-10
Thymeleaf sec:authorize 标签不生效
2019-03-11