首页 > 其他分享 >ManualResetEvent&ManualResetEventSlim

ManualResetEvent&ManualResetEventSlim

时间:2024-10-19 21:59:37浏览次数:6  
标签:mres2 mres3 Console ManualResetEventSlim ManualResetEvent WriteLine

ManualResetEvent

ManualResetEvent有三个重要的方法,分别为:waiteone(),set(),reset(),其含义如下:

1.WaitOne()即等待信号发出,即可往下运行。

2.set()发出信号,让线程方法继续往下运行,并允许其他线程(如有)一并往下运行。

3.reset()重新初始化(即:去掉票据)变为ManualResetEvent(false)形式。

官方示例如下:

internal class Program
{
    private static ManualResetEvent mre = new ManualResetEvent(false);
    static void Main()
    {
        Console.WriteLine("\n初始化3个线程,并在遇到waitone时阻塞运行:\n");
        for (int i = 0; i <= 2; i++)
        {
            Thread t = new Thread(ThreadProc);
            t.Name = "Thread_" + i;
            t.Start();
        }

        Thread.Sleep(500);
        Console.WriteLine("\n三个线程已经启动,请按回车键调用Set()方法来释放3个阻塞线程");
        Console.ReadLine();

        mre.Set();

        Thread.Sleep(500);
        Console.WriteLine("\n当这个ManualResetEvent活得信号,3个线程都会从WaitOne()方法内返回,并继续运行(如果有新线程被创建)不会被阻塞,可按回车键进行观察:\n");
        Console.ReadLine();

        for (int i = 3; i <= 4; i++)
        {
            Thread t = new Thread(ThreadProc);
            t.Name = "Thread_" + i;
            t.Start();
        }

        Thread.Sleep(500);
        Console.WriteLine("\n按回车键调用 Reset()方法(设置为无信号状态),重新初始化一个线程运行,并在WaitOne()方法处停下来\n");
        Console.ReadLine();

        mre.Reset();

        // Start a thread that waits on the ManualResetEvent.
        Thread t5 = new Thread(ThreadProc);
        t5.Name = "Thread_5";
        t5.Start();

        Thread.Sleep(500);
        Console.WriteLine("\n按回车键调用 Set() 方法,然后结束演示.");
        Console.ReadLine();

        mre.Set();
        Console.ReadLine();
    }

    private static void ThreadProc()
    {
        string name = Thread.CurrentThread.Name;
        Console.WriteLine(name + " starts and calls mre.WaitOne()");
        mre.WaitOne();
        Console.WriteLine(name + " ends.");
    }
}

运行结果:

ManualResetEventSlim:

ManualResetEventSlim是ManualResetEvent的简化版或者叫优化版,其主要原理为采用了自旋方式来提高性能,适用于短期内等待的情况,性能比后者要好很多。适用于一次写入,多次读取时候的线程同步场景。

官方示例代码:

 internal class Program
 {
     static void Main(string[] args)
     {
         MRES_SetWaitReset();
         Console.ReadKey();
     }
     static void MRES_SetWaitReset()
     {
         ManualResetEventSlim mres1 = new ManualResetEventSlim(false);
         ManualResetEventSlim mres2 = new ManualResetEventSlim(false);
         ManualResetEventSlim mres3 = new ManualResetEventSlim(true); 

         var observer = Task.Factory.StartNew(() =>
         {
             mres1.Wait();
             Console.WriteLine("mres1!阻塞结束继续运行");
             Console.WriteLine("mres3即将被重置");
             mres3.Reset(); 
             Console.WriteLine("mres2即将获取到票据");
             mres2.Set();
         });

         Console.WriteLine("主线程: mres3.IsSet = {0} (should be true)", mres3.IsSet);
         Console.WriteLine("主线程:mres1即将获取信号");
         mres1.Set();
         Console.WriteLine("主线程:mres2即将阻塞");
         mres2.Wait();
         Console.WriteLine("主线程:mres2已获取信号!");
         Console.WriteLine("主线程: mres3.IsSet = {0} (should be false)", mres3.IsSet);
observer.Wait(); // make sure that this has fully completed mres1.Dispose(); mres2.Dispose(); mres3.Dispose(); } }

运行结果:

 

标签:mres2,mres3,Console,ManualResetEventSlim,ManualResetEvent,WriteLine
From: https://www.cnblogs.com/jizhong/p/18476153

相关文章

  • C#中使用AutoResetEvent或者ManualResetEvent做线程管理
    1.Task/thread/sync/async..await/WhenAll相关基础知识参见此处链接2.什么是AutoResetEvent和ManualResetEvent事件他们都是C#中System.Threading下面的类。用于在多个线程之间进行事件通知和管理。他们的管理方法主要是三个:Reset():关闭WaitOne():阻挡Set():启动AutoR......
  • C#ManualResetEvent 在线程中的使用
    ManualResetEvent用于表示线程同步事件,可以使得线程等待信号发射之后才继续执行下一步,否则一直处于等待状态中。ManualResetEvent的常用方法构造函数ManualResetEvent(bool);ManualResetEventmanualResetEvent=newManualResetEvent(false);//false将初始状态设......
  • ManualResetEvent set waitone
    staticvoidManualResetEventFalseReset(){varsignal=newManualResetEvent(false);intx=10;PrintLine();newThread(()=>{PrintLine();x++;Thread.Sleep(1000);PrintLine();......
  • C# ManualResetEvent
    C#ManualResetEventManualResetEvent被用于在两个或多个线程间进行线程信号发送。多个线程可以通过调用ManualResetEvent对象的WaitOne方法进入等待或阻塞状态。当控制线程调用Set()方法,所有等待线程将恢复并继续执行。ManualResetEvent是如何工作的在内存中保持着一个bool值......
  • ManualResetEvent
    表示线程同步事件,收到信号时,必须手动重置该事件。此类不能被继承。  该示例以 ManualResetEvent 处于未对齐状态的开头,(即传递到 false 构造函数)。该示例创建三个线程,其中每个线程通过调用其 WaitOne 方法在上ManualResetEvent阻止。当用户按 Enter 键时,该......
  • 多线程同步AutoResetEvent 和ManualResetEvent
         ......
  • AutoResetEvent/ManualResetEvent 的简单理解与运用
    AutoResetEvent和ManualResetEvent只是构造函数包装器它们唯一要做的就是使用EventResetMode.AutoReset或EventResetMode.ManualReset从EventWaitHandle调用构造函数.......
  • c#线程学习之ManualResetEvent和AutoResetEvent的区别!
    转自:https://www.cnblogs.com/jicheng/articles/5998244.html在讨论这个问题之前,我们先了解这样一种观点,线程之间的通信是通过发信号来进行沟通的。(这不是废话)   ......
  • AutoResetEvent 与 ManualResetEvent
    1.作用AutoResetEvent和ManualResetEvent可用于控制线程暂停或继续。 2.三个重要的方法如果把每个线程比作一辆汽车的话,AutoResetEvent和ManualResetEvent就是公路......