ManualResetEvent类的用法

本文详细介绍了ManualResetEvent类在C#中的使用,包括如何通过Set()和Reset()方法控制线程的阻塞与释放,以及在多线程异步执行中的应用。通过实例展示了在不同状态下,WaitOne()方法对任务执行的影响,揭示了线程同步的基本原理。
摘要由CSDN通过智能技术生成


在这里插入图片描述
#作用

一个线程通知其他一个或多个线程正在发送的事件。

ManualResetEvent manualResetEvent = new ManualResetEvent(false);

参数表示调用WaitOne()方法的线程是继续执行(true)还是阻塞(false)。

WaitOne():调用WaitOne()方法的线程会阻塞,等待主控线程的manualResetEvent.Set()信号。

Set():将事件状态设为true,调用WaitOne()的线程继续执行。
Reset():将事件状态设为false,调用WaitOne()的线程阻塞。

Set() Reset():只针对WaitOne()方法,不影响WaitOne()方法之前的程序执行。若没有信号,调用WaitOne()方法的线程一直阻塞。

1.事件初始状态设为false,task线程在第一个WaitOne()处阻塞。

using System;
using System.Threading;
using System.Threading.Tasks;
namespace ManualResetEvent测试
{
   
    class Program
    {
   
        static ManualResetEvent manualResetEvent = new ManualResetEvent(false);

        static void Main(string[] args)
        {
   
            //Task线程和主线程同时执行
            Task task = Task.Factory.StartNew(() =>
            {
   
                GetDataFromServer(1);
            });
            Console.ReadLine();
        }

        static void GetDataFromServer(int serverNumber)
        {
   
            Console.WriteLine("I get first data from server" + serverNumber);
            manualResetEvent.WaitOne();
            Console.WriteLine("I get second data from server" + serverNumber);
            Thread.Sleep(TimeSpan.FromSeconds(2));
            Console.WriteLine("I get third data from server" + serverNumber);
            manualResetEvent.WaitOne();
            Console.WriteLine("All the data collected from server" + serverNumber);
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值