117.info
人生若只如初见

C#中ManualResetEvent实现线程的暂停与恢复

在C#中,可以使用ManualResetEvent来实现线程的暂停和恢复。ManualResetEvent是一个同步对象,它包含一个布尔值,表示是否发出信号。当布尔值为true时,表示信号已发出,线程可以继续执行;当布尔值为false时,表示信号未发出,线程需要暂停等待。

下面是一个示例代码,演示了如何使用ManualResetEvent来实现线程的暂停和恢复:

using System;
using System.Threading;
public class Program
{
private static ManualResetEvent pauseEvent = new ManualResetEvent(true); // 初始状态为true,线程可以继续执行
public static void Main(string[] args)
{
Thread thread = new Thread(WorkerThread);
thread.Start();
Console.WriteLine("Press any key to pause the thread...");
Console.ReadKey();
PauseThread(); // 暂停线程
Console.WriteLine("Press any key to resume the thread...");
Console.ReadKey();
ResumeThread(); // 恢复线程
Console.WriteLine("Press any key to stop the thread...");
Console.ReadKey();
StopThread(); // 停止线程
}
private static void WorkerThread()
{
while (true)
{
// 检查是否暂停线程
pauseEvent.WaitOne();
// 执行任务
Console.WriteLine("Working...");
// 模拟耗时操作
Thread.Sleep(1000);
}
}
private static void PauseThread()
{
pauseEvent.Reset(); // 设置为false,线程将暂停等待
}
private static void ResumeThread()
{
pauseEvent.Set(); // 设置为true,线程将继续执行
}
private static void StopThread()
{
pauseEvent.Set(); // 设置为true,确保线程可以继续执行以结束循环
// 其他处理逻辑...
// 终止线程
Environment.Exit(0);
}
}

在上面的示例中,程序创建了一个线程(WorkerThread),并在主线程中通过按键的方式来控制线程的暂停和恢复。在WorkerThread中,使用pauseEvent的WaitOne方法来检查是否暂停线程,如果暂停,则线程会处于等待状态,直到调用ResumeThread方法将pauseEvent设置为true,线程才会继续执行。

需要注意的是,使用ManualResetEvent来实现线程的暂停和恢复时,线程不能被阻塞在其他的同步对象(如Mutex、Semaphore等)上,否则可能会出现死锁的情况。

未经允许不得转载 » 本文链接:https://www.117.info/ask/fec1dAzsLBg5RA1I.html

推荐文章

  • c++如何交换两个数的值

    在C++中,有多种方式可以交换两个数的值。以下是其中一种常用的方法:
    #include void swap(int& a, int& b) {
    int temp = a;
    a = b;
    b = te...

  • c++获取当前时间的方法有哪些

    在C++中获取当前时间的方法有以下几种: 使用time函数:time函数返回自1970年1月1日以来经过的秒数,可以使用time(NULL)来获取当前时间的秒数。 #include #inclu...

  • C#中SqlTransaction与TransactionScope的区别是什么

    SqlTransaction是ADO.NET中的一个类,用于管理数据库事务。它是一个连接级别的事务,只能用于单个数据库连接,不能跨多个数据库连接。SqlTransaction需要手动提交...

  • c++怎么把字符串转换成数组

    要将字符串转换为数组,可以使用std::string的c_str()方法来获取字符串的C风格字符数组,然后将其复制到新的数组中。以下是一个示例代码:
    #include #inclu...

  • cacls命令设置文件及其文件夹权限的方法

    通过cacls命令可以设置文件和文件夹的权限。以下是一些常见的cacls命令及其用法: 设置文件的权限: cacls 文件名 /e /g 用户名:权限
    例如:cacls C:\test....

  • WPF数据绑定中的RelativeSource属性

    RelativeSource属性用于在WPF数据绑定中指定一个相对的数据源。它允许您引用与绑定目标对象不同的元素或属性。
    RelativeSource属性有以下几个常用的选项: ...

  • Android 启动模式FLAG_ACTIVITY_CLEAR_TOP案例详解

    在Android中,启动模式(launch mode)用于确定Activity的启动方式和行为。其中,FLAG_ACTIVITY_CLEAR_TOP是一种启动模式,它用于清除位于当前Activity上方的所有...

  • Java NegativeArraySizeException异常解决方案

    Java中的NegativeArraySizeException异常是由于数组的大小为负数而引起的异常。要解决这个问题,可以采取以下几种方法: 检查数组大小的赋值。确保在创建数组时,...