C#两种进程暂停和继续的方法 2021-02-16
发布日期:2021-05-10 23:37:17 浏览次数:32 分类:精选文章

本文共 2711 字,大约阅读时间需要 9 分钟。

C# 启用和暂停进程的两种方法

在编程中,进程的暂停和继续是一个常见但关键的操作。对于C#开发者而言,有两种主要的方法可以实现这一功能。以下是两种方法的详细说明和代码示例。


方法一:使用 Thread.SuspendThread.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.SuspendThread.Resume
    • 如果需要更高级的信号控制,尤其是在多线程环境中,使用 ManualResetEvent 更为合适。
  • 线程状态的检查

    • 在方法一中,检查 ThreadState 保证操作的有效性。
    • 在方法二中,使用信号量机制确保线程的等待和唤醒。

总结

这两种方法都可以实现进程的暂停和继续,但在具体场景中选择哪种方式取决于你的需求和线程复杂度。

上一篇:c# NAudio 采集麦克风电平并显示在progressBar 2021-02-16
下一篇:.NET NAudio音频录制方法 2021-02-13

发表评论

最新留言

能坚持,总会有不一样的收获!
[***.219.124.196]2025年04月16日 00时20分41秒