Monitor 类的TryEnter() 方法在尝试获取一个对象上的显式锁方面和 Enter() 方法类似。然而,它不像Enter()方法那样会阻塞执行。如果线程成功进入关键区域那么TryEnter()方法会返回true.

TryEnter()方法的三个重载方法中的两个以一个timeout类型值作为参数,表示按照指定时间等待锁。我们来看一个关于如何使用TryEnter()方法的例子,MonitorTryEnter.cs:

/*************************************
/* Copyright (c) 2012 Daniel Dong* * Author:oDaniel Dong* Blog:o  www.cnblogs.com/danielWise* Email:o guofoo@163.com* */using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;namespace MonitorTryEnter
{public class TryEnter{public TryEnter(){}public void CriticalSection(){bool b = Monitor.TryEnter(this, 1000);Console.WriteLine("Thread "+ Thread.CurrentThread.GetHashCode()+ " TryEnter Value " + b);if (b){for (int i = 1; i <= 3; i++){Thread.Sleep(1000);Console.WriteLine(i + " "+ Thread.CurrentThread.GetHashCode() + " ");}}if (b){Monitor.Exit(this);}}public static void Main(){TryEnter a = new TryEnter();Thread t1 = new Thread(new ThreadStart(a.CriticalSection));Thread t2 = new Thread(new ThreadStart(a.CriticalSection));t1.Start();t2.Start();Console.ReadLine();}}
}

一个可能的输出结果如下:

当发生资源争夺而你又不像让线程睡眠一段不可预期的时间时TryEnter()方法很有用。向ISP拨号的例子很好的解释这个。假设有两个程序A和B,它们都想使用同一个调制解调器向ISP拨号。而一旦连接建立那么只会有一个网络连接,我们不知道已有的应用程序将会连接多长时间。假设程序A首先向ISP拨号,然后程序B也向ISP拨号;毫无疑问程序B将会一直等待,因为我们不知道程序A将连接多久。在这种情况下,程序B可能使用TryEnter()来确定调制解调器是否已经被另外一个应用程序锁定(本例中是程序A),而不是使用Enter()方法导致一直等待。

lock 关键字

lock 关键字可以作为Monitor类的一个替代。下面两个代码块是等效的:

Monitor.Enter(this);
//...
Monitor.Exit(this);lock (this)
{//...
}

下面的例子, Locking.cs, 使用lock 关键字而不是Monitor方法:

/*************************************
/* copyright (c) 2012 daniel dong* * author:daniel dong* blog:  www.cnblogs.com/danielwise* email: guofoo@163.com* */using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;namespace Lock
{class LockWord{private int result = 0;public void CriticalSection(){lock (this){//Enter the Critical SectionConsole.WriteLine("Entered Thread "+ Thread.CurrentThread.GetHashCode());for (int i = 1; i <= 5; i++){Console.WriteLine("Result = " + result+++ " ThreadID "+ Thread.CurrentThread.GetHashCode());Thread.Sleep(1000);}Console.WriteLine("Exiting Thread "+ Thread.CurrentThread.GetHashCode());}}public static void Main(string[] args){LockWord e = new LockWord();Thread t1 = new Thread(new ThreadStart(e.CriticalSection));t1.Start();Thread t2 = new Thread(new ThreadStart(e.CriticalSection));t2.Start();//Wait till the user enters somethingConsole.ReadLine();}}
}

Locking.cs 的输出与MonitorEnterExit(需要提供一个参数)一样:

下一篇将介绍ReaderWriterLock 类…

转载于:https://www.cnblogs.com/danielWise/archive/2012/02/05/2339340.html

C# 线程手册 第三章 使用线程 Monitor.TryEnter()相关推荐

  1. C# 线程手册 第三章 使用线程 实现一个数据库连接池(实战篇)

    在企业级软件开发过程中,为了改善应用程序的性能需要通常使用对象池来控制对象的实例化.例如,在我们每次需要连接一个数据库时都需要创建一个数据库连接,而数据库连接是非常昂贵的对象.所以,为了节省为每次数据 ...

  2. C# 线程手册 第三章 使用线程

    概要 在之前章节,我们已经讨论过线程在开发多用户应用程序时扮演的重要角色.我们已经使用线程来解决一些重要的问题,比如让多个用户或者客户端在同一时间访问同一个资源.然而,在学习过程中我们忽略了一个问题, ...

  3. Java7并发编程指南——第三章:线程同步辅助类

    Java7并发编程指南--第三章:线程同步辅助类 @(并发和IO流) Java7并发编程指南第三章线程同步辅助类 思维导图 项目代码 思维导图 项目代码 GitHub:Java7Concurrency ...

  4. C# 线程手册 第四章 线程设计原则 对等线程模型

    我们将要描述的下一个线程模型是对等线程模型.在这个线程模型中,每个线程都会从合适的源接收它自己的输入并对应地处理.这个模型在图4中做了描述. 图 4 在上面的图片中,UI 线程将根据键盘和鼠标的输入进 ...

  5. MySQL 5.6 手册 第三章 目录

    Chapter 3 Tutorial 第三章 辅导教程 Table of Contents 目录   3.1 Connecting to and Disconnecting from the Serv ...

  6. 线程学习(三):线程的互斥

    线程互斥 生产者与消费者模型 为什么需要线程同步和互斥 线程互斥 没有线程互斥会怎么样 mutex(互斥量) 互斥量接口 互斥量初始化有两种方式 互斥量销毁 互斥量的加锁和解锁 死锁 互斥锁使用步骤 ...

  7. Android 渗透测试学习手册 第三章 Android 应用的逆向和审计

    第三章 Android 应用的逆向和审计 作者:Aditya Gupta 译者:飞龙 协议:CC BY-NC-SA 4.0 在本章中,我们将查看 Android 应用程序或.apk文件,并了解其不同的 ...

  8. Java基础 - 坦克大战(第三章,线程基础与线程使用)

    文章目录 本章内容 - 多线程处理 绘制敌方坦克 线程基础 线程相关概念 程序(program) 进程 什么是线程 其他相关概念 单线程 多线程 并发 并行 获取当前电脑处理器(cpu)个数 Java ...

  9. C# 线程手册 第五章 扩展多线程应用程序 系列

    [第1篇] 什么是线程池 到目前为止我们使用多线程应用程序的目的是尽可能多地使用计算机处理器资源.所以,看起来我们仅需要为每个独立的任务分配一个不同的线程,并让处理器确定在任何时间它总会处理其中的某一 ...

最新文章

  1. 独家 | 我这样预测了医疗AI的发展,或许你也可以(附论文链接)
  2. Elasticsearch学习笔记-04修改数据
  3. 【Android 安装包优化】使用 lib7zr.so 动态库处理压缩文件 ( 拷贝 lib7zr.so 动态库头文件到 Android 工程中 | 配置 CMakeLists.txt 构建脚本 )
  4. 博客搬到CSDN了,以后就老实的呆在这儿吧~~
  5. 全球与中国文件夹架市场研究与商业模式创新分析报告2022-2028年
  6. 11gpath失败 oracle_Oracle 11gR2执行DBCA报错误
  7. ffmpeg的新东东:AVFilter
  8. windows10上安装mysql
  9. 单片机c语言检测压力值,基于单片机的压力检测系统设计论文.doc
  10. [zz]C#中的Type类和Assembly类
  11. 从零搭建LNMP环境(三) - 安装MySQL数据库服务器
  12. Hibernate中saveOrUpdate()和merge()的区别
  13. Windows下如何实现Ruby操作MongoDB(环境安装配置)
  14. 如何搜索你想要的R包?
  15. 使用IdleTest进行TDD单元测试驱动开发演练(3) 之 ASP.NET MVC
  16. NLTK在python中文字所表达的情感预测
  17. Mac上java开发工具
  18. 手机双拼输入法下的智能纠错
  19. golang:模拟http post请求
  20. 4A 统一安全管理平台解决方案。

热门文章

  1. iOS沙盒文件夹及获取路劲方法
  2. 马昕璐201771010118《面向对象程序设计(java)》第七周学习总结
  3. oracle 分页查询
  4. QSharedMemory共享内存实现进程间通讯(IPC)及禁止程序多开
  5. mysql主键异常(冲突)
  6. 《学习OpenCV》课后习题解答1
  7. [原]Jenkins(十二)---jenkins管理员用户无法登陆解决办法Access Denied
  8. 重新设定mysql密码~,网上方法都是,这里选一个。
  9. java源码导入eclipse_spring framework源码下载并导入eclipse
  10. 单体预聚合的目的是什么_线型低密度聚乙烯的单体单元比例到底是多少?