AutoResetEvent 的定义

//定义两个信号锁
AutoResetEvent ReadTxt = new AutoResetEvent(false);
AutoResetEvent UploadTxt = new AutoResetEvent(false);

默认是false 也就是关闭状态了。这里要 理解信号 锁,实际就像某大神说的,把waitone()想象成地铁的刷卡进站,就是那个刷卡器,你用set()卡刷一次,waitone()由关闭状态进入打开状态。运行完waitone下边剩下的程序。一般waitone不在循环内的话,执行一次,程序结束退出,相当于线程执行的程序退出了,waitone 下次失效,因为程序都失效了,waitone也就没什么用处了,所以不在循环内,waitone 感觉没什么鸟用,不重复利用waitone跟set来回切换的话,直接用一个thread 运行一下就好了。

所以要用好上边的AutoResetEvent  中的waitone和set 中间加循环机制才会实现两个线程之间,通过set waitone 来回切换。

在学习多线程的过程中,需要循序渐渐,要有耐心,多线程的端倪才会露出,才会慢慢掌握。

就类似下边一个程序

程序的片段

private void Readtxt(object lst)
{
AutoResetEvent ReadTxt = (lst as List<AutoResetEvent>)[];
AutoResetEvent UploadTxt = (lst as List<AutoResetEvent>)[];
try
{
string file = Pathstr; ;
StreamReader sr = new StreamReader(file, System.Text.Encoding.Default);
while (sr.Peek() > -)
{
line = sr.ReadLine().ToString().Replace("\r\n", "");
//跳过行空格
if (line.Trim() != "")
{
Thread.Sleep();
string[] lines = line.Split("".ToArray(), StringSplitOptions.RemoveEmptyEntries);
if (lines.Length >= )
{
zsNum = new NumCon();
zsNum.zsNum = lines[];
list.Add(zsNum);
if (list.Count % == )
{
ReadTxt.WaitOne();
Console.WriteLine("");
UploadTxt.Set();
ReadTxt.WaitOne(); 是个刷卡器,门禁,程序运行到此停止,需要等待set 命令出现,才会进行下一步,再此就是
ReadTxt.Set();  它不出现程序就不执行,它出现了,程序执行完下边的代码,注意主程序是在循环里边,执行完下边的代码,主程序继续执行这个循环,又在waitone()
处停下。等待set信号,上边我这个程序是循环读取txt内容,每十个加入list中,通过上边程序,第一次执行到waione() list
中已经加入了10个数,程序运行UploadTxt.Set();时, 主程序也在继续运行循环里边的数据,导致读list的时候,实际是加入了20个数,通过不停的调试,设置断点,
加代码,最后才悟到这个问题。
同时设置断点调试多线程需要注意一下几个问题
线程的程序若不设置断点的话,从主程序到线程程序,你按f11是不会逐语句到线程的,可以想想多线是同时并发的,所以在某一刻无法逐语句的。
只有懂得了上边的概念,不要怀疑程序编译问题,出错总有程序逻辑或者自己思维上的误差导致的。
上边的方法可以通过概念和 ,你想检查的地方设置断点,程序运行过去或者乱跳过去时看看,有时多线程设置断电点后,和实际运行时结果运行也有差异,在调试上边
程序时已经充分的体现出来。

AutoResetEvent waitone set进一步理解补充的更多相关文章

  1. Java内存管理的进一步理解-模拟过程图解

    Java内存管理的进一步理解-模拟过程图解--转载 java的内存管理分为: 1.堆内存:2.栈内存:3.方法区:4.本地方法区 /* 1:方法区      方法区存放装载的类数据信息包括:      ...

  2. 对于python装饰器结合递归的进一步理解

    对于python装饰器结合递归的进一步理解 代码如下: import functools def memoize(fn): print('start memoize') known = dict() ...

  3. 个人对AutoResetEvent和ManualResetEvent的理解(转载)

    仅个人见解,不对之处请指正,谢谢. 一.作用 AutoResetEvent和ManualResetEvent可用于控制线程暂停或继续,拥有重要的三个方法:WaitOne.Set和Reset. 这三个方 ...

  4. 个人对AutoResetEvent和ManualResetEvent的理解

    一.作用 AutoResetEvent和ManualResetEvent可用于控制线程暂停或继续,拥有重要的三个方法:WaitOne.Set和Reset. 这三个方法的官方定义并不好理解,什么终止.非 ...

  5. [转]个人对AutoResetEvent和ManualResetEvent的理解

    仅个人见解,不对之处请指正,谢谢. 一.作用 AutoResetEvent和ManualResetEvent可用于控制线程暂停或继续,拥有重要的三个方法:WaitOne.Set和Reset. 这三个方 ...

  6. 对iOS后台模式最多10分钟运行时间的进一步理解

    在app进入后台时,系统初始默认是只有10s的处理时间,但如果10s不够,我们可以主动申请,网上流传最多的一个说法是10分钟. 但这种说法有个前提: 那就是iOS7之前,是这样 但从iOS7开始,我们 ...

  7. 对Java中字符串的进一步理解

    字符串在程序开发中无处不在,也是用户交互所涉及到最频繁的数据类型,那么字符串不仅仅就是我们简单的理解的String str = "abc";一起来更加深入的看一下 在Java中,字 ...

  8. 通过回调函数的理解来进一步理解ajax及其注意的用法

    一,再一次理解回调函数 (function($){ $.fn.shadow = function(opts){ //定义的默认的参数 var defaults = { copies: 5, opaci ...

  9. 『cs231n』卷积神经网络的可视化与进一步理解

    cs231n的第18课理解起来很吃力,听后又查了一些资料才算是勉强弄懂,所以这里贴一篇博文(根据自己理解有所修改)和原论文的翻译加深加深理解,其中原论文翻译比博文更容易理解,但是太长,而博文是业者而非 ...

随机推荐

  1. PHP入门part1

    有人说php是世界上最好的语言,那它好在哪呢. 它是开源自由的软件,能够在所有的操作平台上稳定的运行,入门比较简单.对于我这种没学过什么计算机语言的人是最好的起步点. PHP现在的含义:Hypetex ...

  2. 用Visual Studio调试Windows和驱动程序

    由于本人能力有限,翻译不足之处敬请谅解,欢迎批评指正:sunylat@163.com Visual Studio版本:Visual Studio 2015企业版,中文环境. MSDN原文:https: ...

  3. Array,ArrayList、List<T>、HashSet<T>、LinkedList<T>与Dictionary<K,V>

    Array: 数组在C#中最早出现的.在内存中是连续存储的,所以它的索引速度非常快,而且赋值与修改元素也很简单. 但是数组存在一些不足的地方.在数组的两个数据间插入数据是很麻烦的,而且在声明数组的时候 ...

  4. eclipse 工程默认编码修改 JSP编码修改

    1. Window->Preferences->General->Workspace->Text file encoding 将其改为UFT-8  新建的文件即为UTF-8编码 ...

  5. [EventBus源码解析] EventBus.register 方法详述

    前情概要 在上一篇中,介绍了EventBus的基本使用方法,以及一部分进阶技巧.本篇及以后的几篇blog将会集中解析EventBus.java,看看作者是如何优雅地实现这个看似简单的事件分发/接收机制 ...

  6. 慕课网-安卓工程师初养成-6-5 使用循环操作 Java 中的数组

    来源:http://www.imooc.com/code/1531 实际开发中我们经常使用循环控制数组成员的操作.如: 运行结果: 其中,  用于获取数组的长度 需要注意的“小毛病”: 1. 数组下标 ...

  7. NOIP2012 同余方程-拓展欧几里得

    题目描述 求关于 x 的同余方程 ax ≡ 1 (mod b)的最小正整数解. 输入输出格式 输入格式: 输入只有一行,包含两个正整数 a, b,用一个空格隔开. 输出格式: 输出只有一行,包含一个正 ...

  8. [转载]:经纬度与WGS84坐标转换

    本代码实现在WGS84系统的大地坐标(BLH)和空间直角坐标(XYZ)的互相转换,符合标准语法,可直接使用 如下代码,输出为: WGS84:  -2175790.73969891    4461032 ...

  9. java学习第9天

    形式参数和返回值的问题 (1)形式参数: 类名:需要该类的对象 抽象类名:需要该类的子类对象 接口名:需要该接口的实现类对象 (2)返回值类型: 类名:返回的是该类的对象 抽象类名:返回的是该类的子类 ...

  10. Egret和Http请求 (Ajax、XMLHttpRequest、Post、Get)

    一  Http请求 二  AJax和XMLHttpRequest 三  一个Ajax例子 四 Egret中的egret.HttpRequest 五 Post和Get区别 一 Http请求 Http深入 ...