当前位置: 首页 > news >正文

自己家的电脑宽带50m做网站服务器百度一下你就知道百度官网

自己家的电脑宽带50m做网站服务器,百度一下你就知道百度官网,手机网站安全证书过期怎么处理,如何做美食网站C#读写者线程(用AutoResetEvent实现同步) 1. AutoResetEvent简介 通知正在等待的线程已发生事件。无法继承此类。 常用方法简介: AutoResetEvent(bool initialState):构造函数,用一个指示是否将初始状态设置为终止的布…

C#读写者线程(用AutoResetEvent实现同步)

 

 

1. AutoResetEvent简介

 

通知正在等待的线程已发生事件。无法继承此类。

 

常用方法简介:

AutoResetEvent(bool initialState):构造函数,用一个指示是否将初始状态设置为终止的布尔值初始化该类的新实例。
    false:无信号,子线程的WaitOne方法不会被自动调用
    true:有信号,子线程的WaitOne方法会被自动调用

public bool Reset ():将事件状态设置为非终止状态,导致线程阻止;如果该操作成功,则返回true;否则,返回false。
public bool Set ():将事件状态设置为终止状态,允许一个或多个等待线程继续;如果该操作成功,则返回true;否则,返回false。
    对于具有 EventResetMode.AutoReset(包括 AutoResetEvent)的 EventWaitHandle,Set 方法释放单个线程。如果没有等待线程,等待句柄将一直保持终止状态,直到某个线程尝试等待它,或者直到它的 Reset 方法被调用。


    对于具有 EventResetMode.ManualReset(包括 ManualResetEvent)的 EventWaitHandle,调用Set 方法将使等待句柄一直保持终止状态,直到它的 Reset 方法被调用。

 

WaitOne方法
       当在派生类中重写时,阻止当前线程,直到当前的 WaitHandle 收到信号。

WaitHandle.WaitOne () 当在派生类中重写时,阻止当前线程,直到当前的 WaitHandle 收到信号。 由.NET Compact Framework 支持。
WaitHandle.WaitOne(Int32, Boolean)  在派生类中被重写时,阻止当前线程,直到当前的WaitHandle 收到信号,使用 32 位有符号整数度量时间间隔并指定是否在等待之前退出同步域。由 .NET Compact Framework 支持。
WaitHandle.WaitOne(TimeSpan, Boolean)  在派生类中被重写时,阻止当前线程,直到当前实例收到信号,使用 TimeSpan 度量时间间隔并指定是否在等待之前退出同步域。
2. 读写者线程例子

 

本例子中,主线程作为写线程,要对某个数据(本例中是个变量)赋值(即写动作),而读线程则等待写线程每次写完数据发出通知,待读线程收到通知后,将数据读出并显示。


using System;
using System.Collections.Generic;
using System.Text;

using System.Threading;

namespace TestAutoResetEvent
{
    ///
    /// 读写者线程
    /// 主线程写,子线程读,且只有将数据写入后,读线程才能将其读出
    ///
    class Program
    {
        //写线程将数据写入myData
        static int myData = 100;

        //读写次数
        const int readWriteCount = 10;

        //false:初始时没有信号
        static AutoResetEvent autoResetEvent = new AutoResetEvent(false);

        static void Main(string[] args)
        {
            //开启一个读线程(子线程)
            Thread readerThread = new Thread(new ThreadStart(ReadThreadProc));
            readerThread.Name = "ReaderThread";
            readerThread.Start();

            for (int i = 1; i <= readWriteCount; i++)
            {
                Console.WriteLine("MainThread writing : {0}", i);

                //主(写)线程将数据写入
                myData = i;

                //主(写)线程发信号,说明值已写过了
                //即通知正在等待的线程有事件发生
                autoResetEvent.Set();

                Thread.Sleep(0);
            }

            //终止线程
            readerThread.Abort();
        }

        static void ReadThreadProc()
        {
            while (true)
            {
                //在数据被写入前,读线程等待(实际上是等待写线程发出数据写完的信号)
                autoResetEvent.WaitOne();
                Console.WriteLine("{0} reading : {1}", Thread.CurrentThread.Name, myData);
            }
        }
    }
}运行结果如下:

 

 

 

 

由运行结果可以看出,写线程写入的数据有丢失,主要原因是写线程没有给读线程留足够的时间去进行读操作。

 

3. 对1进行修改


将主线程睡眠时间改为非0值,观察运行结果。

using System;
using System.Collections.Generic;
using System.Text;

using System.Threading;

namespace TestAutoResetEvent
{
    ///
    /// 读写者线程
    /// 主线程写,子线程读,且只有将数据写入后,读线程才能将其读出
    ///
    class Program
    {
        //写线程将数据写入myData
        static int myData = 100;

        //读写次数
        const int readWriteCount = 10;

        //false:初始时没有信号
        static AutoResetEvent autoResetEvent = new AutoResetEvent(false);

        static void Main(string[] args)
        {
            //开启一个读线程(子线程)
            Thread readerThread = new Thread(new ThreadStart(ReadThreadProc));
            readerThread.Name = "ReaderThread";
            readerThread.Start();

            for (int i = 1; i <= readWriteCount; i++)
            {
                Console.WriteLine("MainThread writing : {0}", i);

                //主(写)线程将数据写入
                myData = i;

                //主(写)线程发信号,说明值已写过了
                //即通知正在等待的线程有事件发生
                autoResetEvent.Set();

                Thread.Sleep(1);
            }

            //终止线程
            readerThread.Abort();
        }

        static void ReadThreadProc()
        {
            while (true)
            {
                //在数据被写入前,读线程等待(实际上是等待写线程发出数据写完的信号)
                autoResetEvent.WaitOne();
                Console.WriteLine("{0} reading : {1}", Thread.CurrentThread.Name, myData);
            }
        }
    }
}运行结果如下:

 

 

 

有结果可知,当主线程睡眠时间大于0值时,读线程即有足够的时间读取写线程写入的数据。这个睡眠时间的长短可以根据实际应用中子线程的计算量设定。

 

4. 对1再进行修改


主线程在写完数据后根本不睡吗呢?这个时候会发生什么事情?

using System;
using System.Collections.Generic;
using System.Text;

using System.Threading;

namespace TestAutoResetEvent
{
    ///
    /// 读写者线程
    /// 主线程写,子线程读,且只有将数据写入后,读线程才能将其读出
    ///
    class Program
    {
        //写线程将数据写入myData
        static int myData = 100;

        //读写次数
        const int readWriteCount = 10;

        //false:初始时没有信号
        static AutoResetEvent autoResetEvent = new AutoResetEvent(false);

        static void Main(string[] args)
        {
            //开启一个读线程(子线程)
            Thread readerThread = new Thread(new ThreadStart(ReadThreadProc));
            readerThread.Name = "ReaderThread";
            readerThread.Start();

            for (int i = 1; i <= readWriteCount; i++)
            {
                Console.WriteLine("MainThread writing : {0}", i);

                //主(写)线程将数据写入
                myData = i;

                //主(写)线程发信号,说明值已写过了
                //即通知正在等待的线程有事件发生
                autoResetEvent.Set();

                //Thread.Sleep(1);
            }

            //终止线程
            readerThread.Abort();
        }

        static void ReadThreadProc()
        {
            while (true)
            {
                //在数据被写入前,读线程等待(实际上是等待写线程发出数据写完的信号)
                autoResetEvent.WaitOne();
                Console.WriteLine("{0} reading : {1}", Thread.CurrentThread.Name, myData);
            }
        }
    }
}

运行结果如下:

 

 

 

有结果可知,不睡眠的情况和睡眠时间为0(即Thread.Sleep(0);)效果产不多,只是不睡眠丢失的数据更多了。

 

5. 对1再修改


将传递给AutoResetEvent的构造函数的参数设置为true,观察运行结果。

 

using System;
using System.Collections.Generic;
using System.Text;

using System.Threading;

namespace TestAutoResetEvent
{
    ///
    /// 读写者线程
    /// 主线程写,子线程读,且只有将数据写入后,读线程才能将其读出
    ///
    class Program
    {
        //写线程将数据写入myData
        static int myData = 100;

        //读写次数
        const int readWriteCount = 10;

        //false:初始时没有信号
        static AutoResetEvent autoResetEvent = new AutoResetEvent(true);

        static void Main(string[] args)
        {
            //开启一个读线程(子线程)
            Thread readerThread = new Thread(new ThreadStart(ReadThreadProc));
            readerThread.Name = "ReaderThread";
            readerThread.Start();

            for (int i = 1; i <= readWriteCount; i++)
            {
                Console.WriteLine("MainThread writing : {0}", i);

                //主(写)线程将数据写入
                myData = i;

                //主(写)线程发信号,说明值已写过了
                //即通知正在等待的线程有事件发生
                autoResetEvent.Set();

                Thread.Sleep(0);
            }

            //终止线程
            readerThread.Abort();
        }

        static void ReadThreadProc()
        {
            while (true)
            {
                //在数据被写入前,读线程等待(实际上是等待写线程发出数据写完的信号)
                autoResetEvent.WaitOne();
                Console.WriteLine("{0} reading : {1}", Thread.CurrentThread.Name, myData);
            }
        }
    }
}

运行结果如下:

 

 

 

 

若将主线程的睡眠时间改为任意非0值,其运行结果均为下图所示的结果。

 

 

                         

6. 其他修改

 

将主线程调用AutoResetEvent对象的Set方法删除,分别对AutoResetEvent的构造函数的参数为false和true观察运行结果。

 

为false,运行结果如下图所示。

 

 

 

 

为true,运行结果如下图所示。

 

 

 

至此,我想我们应该明白AutoResetEvent构造函数的参数的意义了。
false:无信号,子线程的WaitOne方法不会被自动调用;
true:有信号,子线程的WaitOne方法会被自动调用。

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/livelylittlefish/archive/2008/07/30/2735440.aspx

转载于:https://www.cnblogs.com/Godblessyou/archive/2011/04/28/2031887.html

http://www.lbrq.cn/news/2496763.html

相关文章:

  • 更换网站后台管理系统神起网络游戏推广平台
  • 南昌正规网站公司5g网络优化培训
  • 那个网站可以做图标一个产品的宣传和推广方案
  • 高端 网站开发交换友情链接的途径有哪些
  • 企业网站建设怎么选择空间聚合搜索引擎入口
  • 腾讯云如何建设网站首页福州seo招聘
  • 可以看所有网站的浏览器网站seo策划
  • 机械手表网站百度推广一级代理商名单
  • 温州网站定制哪家好属于b2b的网站有哪些
  • 做cp和网站运营付费推广外包
  • wordpress表情外贸网站优化公司
  • 常州市网站建设深圳龙岗区布吉街道
  • 郑州建立网站百度大数据
  • 网站收录怎么提高快速排名优化系统
  • 河南便宜网站建设价格兰州seo新站优化招商
  • 网站架构图的制作网络营销到底是个啥
  • 企业网站建站元素googleplay安卓版下载
  • 厂字型布局网站例子中国搜索引擎有哪些
  • 在网站做登记表备案 如果修改优化大师破解版app
  • wdcp拒绝访问网站十大免费无代码开发软件
  • wordpress次级目录ftp廊坊seo关键词优化
  • 好看的学校网站模板免费下载关键词歌词含义
  • 徐州建站软件现在有什么推广平台
  • 网站服务器试用百度的总部在哪里
  • 怎么仿别人的网站近几天发生的新闻大事
  • 网站建设教程答允苏州久远网络产品推广宣传方案
  • 广州企业网站建设推荐网店营销策略有哪些
  • 网站建设咨询公国内新闻最新消息今天
  • 珠海市网站建设公司网站建设与优化
  • html模板网站想做电商应该怎么入门
  • Nginx 四层(stream)反向代理 + DNS 负载均衡
  • Keepalived + LVS-DR 高可用与负载均衡实验
  • 51c自动驾驶~合集9
  • [SAP ABAP] ALV报表练习4
  • Python编程:初入Python魔法世界
  • 拒绝SQL恐惧:用Python+pyqt打造任意Excel数据库查询系统