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. linux下生成rsa密钥的方法

    首先生成密钥,用命令ssh-keygen –t rsa 运行后可以一直空格,生成密钥,id_rsa和id_rsa.pub文件 ,默认放在/root/.ssh/下,.ssh文件是隐藏的,要显示隐藏文件才 ...

  2. 在Label中显示一段文字

    Let’s create a new Xamarin.Forms PCL solution, named Greetings, using the same process described abo ...

  3. 安装ss

    用的是centos , shell中执行如下命令 yum install python-setuptools && easy_install pip pip install shado ...

  4. (String)将一个String里面的单词反转

    e.g.  i love java    return   java love i public static String reverseStr(String str) { String[] str ...

  5. XE6移动开发环境搭建之IOS篇(4):VMware9里安装Mac OSX 10.8(有图有真相)

    网上能找到的关于Delphi XE系列的移动开发环境的相关文章甚少,本文尽量以详细的图文内容.傻瓜式的表达来告诉你想要的答案. 原创作品,请尊重作者劳动成果,转载请注明出处!!! 以下内容比较长,我们 ...

  6. C++使用VARIANT实现二维数组的操作

    C++使用VARIANT实现二维数组的操作 VARIANT变量是COM组件之间互相通信的重要的参数变量之一,它可以容纳多种不同的类型,如short.long.double等,包括各类指针和数组.组件之 ...

  7. adb devices offline 问题大总结

    遇到doc对话框中adb devices ,一直显示设备处于offline状态,各种搜后安装所谓的: 1.开启usb调试模式2.关闭第三方手机助手软件3.重启adb服务    adb kill-ser ...

  8. ini 文件

    INI文件是一个无固定标准格式的配置文件.它以简单的文字与简单的结构组成,常常使用在视窗操作系统,或是其他操作系统上,许多程序也会采用INI文件做为设置程序之用.视窗操作系统后来以注册表的形式替换掉I ...

  9. 百度地图api简单使用方法

    百度地图API的使用方法   百度地图API 开始学习百度地图API最简单的方式是看一个简单的示例.以下代码创建了一个520x340大小的地图区域并以天安门作为地图的中心: 1. <html&g ...

  10. DOCTYPE 中xhtml 1.0和 html 4.01区别分析

    前者相对于后者有以下特性: 1.所有的标记都都要闭合 所有的标记都要闭合,如果是单独不成对的标签,在标签最后加一个"/"来关闭它.例如: <h6>close tag & ...