`
pcajax
  • 浏览: 2161892 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

ManualResetEvent详解

阅读更多
 源码下载:

    下载地址:http://files.cnblogs.com/tianzhiliang/ManualResetEventDemo.rar

    Demo:

2. ManualResetEvent详解

    ManualResetEvent 允许线程通过发信号互相通信。通常,此通信涉及一个线程在其他线程进行之前必须完成的任务。当一个线程开始一个活动(此活动必须完成后,其他线程才能开始)时,它调用 Reset 以将 ManualResetEvent 置于非终止状态,此线程可被视为控制 ManualResetEvent。调用 ManualResetEvent 上的 WaitOne 的线程将阻止,并等待信号。当控制线程完成活动时,它调用 Set 以发出等待线程可以继续进行的信号。并释放所有等待线程。一旦它被终止,ManualResetEvent 将保持终止状态(即对 WaitOne 的调用的线程将立即返回,并不阻塞),直到它被手动重置。可以通过将布尔值传递给构造函数来控制 ManualResetEvent 的初始状态,如果初始状态处于终止状态,为 true;否则为 false。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
  
namespace ManualResetEventDemo
{
    class MREDemo
    {
        private ManualResetEvent _mre;
  
        public MREDemo()
        {
            this._mre = new ManualResetEvent(true);
        }
  
        public void CreateThreads()
        {
            Thread t1 = new Thread(new ThreadStart(Run));
            t1.Start();
  
            Thread t2 = new Thread(new ThreadStart(Run));
            t2.Start();
        }
  
        public void Set()
        {
            this._mre.Set();
        }
  
        public void Reset()
        {
            this._mre.Reset();
        }
  
        private void Run()
        {
            string strThreadID = string.Empty;
            try
            {
                while (true)
                {
                    // 阻塞当前线程
                    this._mre.WaitOne();
  
                    strThreadID = Thread.CurrentThread.ManagedThreadId.ToString();
                    Console.WriteLine("Thread(" + strThreadID + ") is running...");
  
                    Thread.Sleep(5000);
                }
            }
            catch(Exception ex)
            {
                Console.WriteLine("线程(" + strThreadID + ")发生异常!错误描述:" + ex.Message.ToString());
            }
        }
  
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
  
namespace ManualResetEventDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("****************************");
            Console.WriteLine("输入\"stop\"停止线程运行...");
            Console.WriteLine("输入\"run\"开启线程运行...");
            Console.WriteLine("****************************\r\n");
  
            MREDemo objMRE = new MREDemo();
            objMRE.CreateThreads();
  
            while (true)
            {
                string input = Console.ReadLine();
                if (input.Trim().ToLower() == "stop")
                {
                    Console.WriteLine("线程已停止运行...");
                    objMRE.Reset();
                }
                else if (input.Trim().ToLower() == "run")
                {
                    Console.WriteLine("线程开启运行...");
                    objMRE.Set();
                }
            }
              
        }
    }
}
分享到:
评论

相关推荐

    C# ManualResetEvent使用方法详解

    2. ManualResetEvent详解  ManualResetEvent 允许线程通过发信号互相通信。通常,此通信涉及一个线程在其他线程进行之前必须完成的任务。当一个线程开始一个活动(此活动必须完成后,其他线程才能开始)时,它调用 ...

    C#中ManualResetEvent用法详解

    C#中ManualResetEvent用法详解 ManualResetEvent 是 C# 中的一种同步机制,它允许线程之间通过发送信号进行通信。下面我们将详细介绍 ManualResetEvent 的用法和实现原理。 一、ManualResetEvent 的介绍 ...

    C# ManualResetEvent用法详解

    C# ManualResetEvent用法详解 C# ManualResetEvent是一种线程同步事件,可以对所有进行等待的线程进行统一管理。其构造函数为`public ManualResetEvent (bool initialState);`,参数`initialState`表示是否初始化,...

    C#多线程详解

    ### C#多线程详解 #### 一、基础篇 **1. 怎样创建一个线程** 在C#中创建线程的方式有很多种,这里主要介绍三种常用的创建方式:使用`Thread`类、使用`Delegate.BeginInvoke`以及使用`ThreadPool....

    NET多线程同步方法详解

    系统内核对象是.NET中更底层的同步工具,包括互斥体(Mutex)、信号量(Semaphore)和事件(AutoResetEvent/ManualResetEvent)。互斥体确保同一时刻只有一个线程访问资源,而信号量可以控制同时访问资源的线程数量。事件...

    C#线程详解,单线程,多线程,线程管理

    - `ManualResetEvent`和`AutoResetEvent`:事件标志,用于等待线程完成特定操作。 - `CountdownEvent`:计数事件,当计数达到零时,所有等待的线程被释放。 - `Barrier`:屏障,使一组线程等待直到所有线程都到达...

    c# 线程同步: 详解lock,monitor,同步事件和等待句柄以及mutex

    例如,AutoResetEvent和ManualResetEvent分别用于单次信号和多次信号。这些事件可以与其他同步机制结合使用,以实现复杂的同步策略。 等待句柄是Windows操作系统级别的同步机制,如Mutex、Semaphore和Event。Mutex...

    c#,多线程详解,对于初学者有一定用途

    `System.Threading`命名空间提供了许多工具,如`ManualResetEvent`和`AutoResetEvent`,用于线程间的同步和通信。 九、线程异常处理 主线程可以捕获子线程的未处理异常,但需要注意线程的异常处理策略,以避免程序...

    c#多线程的奥妙,多线程的概念STAThread教程+源代码,非常好的.

    ManualResetEvent doneEvent = new ManualResetEvent(false); ... // 在子线程中 doneEvent.Set(); // 通知主线程任务已完成 ... // 在主线程中 doneEvent.WaitOne(); // 等待子线程完成 ``` 此外,线程优先级、...

    深入多线程之:用Wait与Pulse模拟一些同步构造的应用详解

    你可能在上篇文章中《深入多线程之:双向信号与竞赛的用法分析》注意到了这个模式:两...去掉,那么我们就得到了一个基本的ManualResetEvent. 让我们使用Wait和Pulse来为ManualResetEvent完成剩余的代码吧。 代码如下:r

    深入多线程之:Wait与Pulse的使用详解

    Monitor借助它的静态方法Wait,Pulse,PulseAll提供了一个更给力的信号构造,使用这些方法和lock语句,你可以自己实现AutoResetEvent,ManualResetEvent和Semaphore。甚至WaitHandle的WaitAll和WaitAny方法了。怎样...

    c#(Socket)异步套接字代码示例

    ### C# Socket 异步通信实现详解 #### 一、引言 在现代网络编程中,Socket 是一种广泛使用的通信方式。它允许不同计算机上的进程通过网络进行数据交换。为了提高程序的性能与响应能力,通常会采用异步操作来避免...

    socket异步连接——示例代码

    ### Socket异步连接详解及示例代码解析 #### 一、引言 在现代网络通信中,`Socket`编程作为一种基础且重要的技术被广泛应用。它为应用程序提供了在不同计算机之间发送与接收数据的能力。根据应用需求的不同,可以...

Global site tag (gtag.js) - Google Analytics