C#中多线程信号控制ManualResetEvent和AutoResetEvent

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms;

namespace WindowsFormsApplication22
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            CheckForIllegalCrossThreadCalls =false ;
        }
        static AutoResetEvent AutoR = new AutoResetEvent(false);//只对一个线程设置为有信号。
       // static ManualResetEvent Manual = new ManualResetEvent(false);//对一个或多个线程设置为有信号。

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            AutoR.Set();//例如我在这里使用Set()方法设置为true有信号,设置完后他会自动调用Reset()方法设置为false无信号。
            //其它线程将会被AutoR.WaitOne();阻止.直到收到为有信号.

            // 这样好处在于控制单个线程还是方便的,但是对于多线程的话就麻烦了,
            // 如果多个线程中对同一个AutoResetEvent 实例的WaitOne方法将只有1个起作用。
            // 而ManualResetEvent不会主动Reset,因此此时WaitOne方法将都有效。
            // 所以绝大数情况下还是尽量使用ManualResetEvent。

            // AutoR.Set();Set()方法表示状态设为ture,让其它线程有信号执行下去。
            // AutoR.Reset();方法表示状态设为false,让其它线程无信号即不能执行下去。

            // 这就是ManualResetEvent和AutoResetEvent 的主要差别呢?

            for (int i = 1; i < 6; i++)
            {

                Thread td = new Thread(ok);
                td.Name = i.ToString();
                td.Start();

            }

        }
        public void ok()
        {

                    AutoR.WaitOne();
                    //阻止或许为等待当前线程执行。直到收到为有信号则运行。
                    //true=有信号;false=无信号.
                    textBox1.AppendText(string.Format("| 线程名字:{0} ",  Thread.CurrentThread.Name));
                    Thread.Sleep(2000);

        }

    }
}
时间: 2024-10-12 08:56:57

C#中多线程信号控制ManualResetEvent和AutoResetEvent的相关文章

C#多线程之二:ManualResetEvent和AutoResetEvent

初次体验 ManualResetEvent和AutoResetEvent主要负责多线程编程中的线程同步:以下一段是引述网上和MSDN的解析: 在.Net多线程编程中,AutoResetEvent和ManualResetEvent这两个类经常用到, 他们的用法很类似,但也有区别.Set方法将信号置为发送状态,Reset方法将信号置为不发送状态,WaitOne等待信号的发送.可以通过构造函数的参数值来决定其初始状态,若为true则非阻塞状态,为false为阻塞状态.如果某个线程调用WaitOne方法

C#多线程之 ManualResetEvent和AutoResetEvent

初次体验 ManualResetEvent和AutoResetEvent主要负责多线程编程中的线程同步:以下一段是引述网上和MSDN的解析: 在.Net多线程编程中,AutoResetEvent和ManualResetEvent这两个类经常用到, 他们的用法很类似,但也有区别.Set方法将信号置为发送状态,Reset方法将信号置为不发送状态,WaitOne等待信号的发送.可以通过构造函数的参数值来决定其初始状态,若为true则非阻塞状态,为false为阻塞状态.如果某个线程调用WaitOne方法

多线程中的信号机制--signwait()函数【转】

本文转载自:http://blog.csdn.net/yusiguyuan/article/details/14237277 在Linux的多线程中使用信号机制,与在进程中使用信号机制有着根本的区别,可以说是完全不同.在进程环境中,对信号的处理是,先注册信号处理函数,当信号异步发生时,调用处理函数来处理信号.它完全是异步的(我们完全不知到信号会在进程的那个执行点到来!).然而信号处理函数的实现,有着许多的限制:比如有一些函数不能在信号处理函数中调用:再比如一些函数read.recv等调用时会被异

第78课 多线程中的信号与槽(上)

1. QThread类中的信号和槽 (1)QThread类拥有发射信号和定义槽函数的能力 (2)QThread中的关键信号 ①void started():线程开始运行时发射该信号 ②void finished():线程完成运行时发射该信号 ③void terminated():线程被异常终止时发射该信号 2. 与线程相关的概念 (1)线程栈 ①进程中存在栈空间的概念(区别于栈数据结构) ②栈空间专用于函数调用(保存函数参数.局部变量等) ③线程拥有独立的栈空间(可调用其它函数) ④只要函数体中

ManualResetEvent和AutoResetEvent的区别

在讨论这个问题之前,我们先了解这样一种观点,线程之间的通信是通过发信号来进行沟通的.(这不是废话) 先来讨论ManualResetEvent,讨论过程中我会穿插一些AutoResetEvent的内容,来做对比: ManualResetEvent都可以阻塞一个或多个线程,直到收到一个信号告诉ManualResetEvent不要再阻塞当前的线程. 可以想象ManualResetEvent这个对象内部有一个Boolean类型的属性IsRelease来控制是否要阻塞当前线程.这个属性我们在初始化的时候可

211. Orchard学习 二 2、ManualResetEvent 与 AutoResetEvent

一.Orchard里异步请求处理线程队列的控制 Orchard的Orchard.WarmupStarter模块,为HttpApplication.BeginRequest时间附加了一个异步处理事件:BeginBeginRequest. 1: /// <summary> 2: /// 启动 System.Web.HttpApplication.BeginRequest 的异步处理的 System.Web.BeginEventHandler 3: /// System.Web.HttpApplic

iOS中多线程原理与runloop介绍

http://mobile.51cto.com/iphone-403490.htm iOS中多线程原理与runloop介绍 iPhone中的线程应用并不是无节制的,官方给出的资料显示iPhone OS下的主线程的堆栈大小是1M,第二个线程开始都是512KB.并且该值不能通过编译器开关或线程API函数来更改.只有主线程有直接修改UI的能力.……>>详细 兄弟专题:iOS人机交互指南之UI设计基础 1 iOS多线程编程知多少 在iOS的世界里有两种实现多线程的方式: 多线程是一个比较轻量级的方法来

对ManualResetEvent和AutoResetEvent的巩固练习

在多线程编程中,最常用到的就是线程同步问题,前段时间开发地址采集服务器,需要携带经纬度到MapAbc中采集后,返回地址,才可以进行下一条经纬度的采集,因为队列处理和解析不是同一个线程,并且是解析经纬度是异步的操作,所以就涉及到线程同步问题,所以针对这个对ManualResetEvent和AutoResetEvent两个信号量巩固练习一下. 1 class Program 2 { 3 static ManualResetEvent _ManualResetEvent = new ManualRes

Python的线程&amp;进程&amp;协程[1] -&gt; 线程 -&gt; 多线程的控制方式

多线程的控制方式 目录 唤醒单个线程等待 唤醒多个线程等待 条件函数等待 事件触发标志 函数延迟启动 设置线程障碍 1 唤醒单个线程等待 Condition类相当于一把高级的锁,可以进行一些复杂的线程同步控制.一般Condition内部都有一把内置的锁对象(默认为RLock),对于Condition的使用主要有以下步骤: 建立两个线程对象,及Condition对象; 线程1首先获取Condition的锁权限,acquire(); 线程1执行需要完成的任务后,调用等待wait(),此时,线程1会阻