博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# 线程手册 第三章 使用线程 Monitor.TryEnter()
阅读量:6678 次
发布时间:2019-06-25

本文共 2651 字,大约阅读时间需要 8 分钟。

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 Section
                Console.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 something
            Console.ReadLine();
        }
    }
}

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

转载于:https://www.cnblogs.com/root7/archive/2012/03/05/2380488.html

你可能感兴趣的文章
中国航信借助NetApp存储系统打造高效数据中心
查看>>
增强加密是把双刃剑
查看>>
外媒:清理数据成数据科学家最大挑战
查看>>
《企业迁云实战》——第2章 2.0企业迁云概述
查看>>
载波聚合:保障LTE-A速率的有力武器
查看>>
WHID注入器:在无线环境下实现HID攻击的最新利器
查看>>
智能制造下徐工开启三大改造
查看>>
SOA减低成本提升效率的最有效的思想方法
查看>>
解读:云计算产业“钱”景
查看>>
思杰投资Vyatta 加强云计算基础设施
查看>>
React Native触摸事件处理详解
查看>>
运营商发力大数据,实现流量经营向大数据运营的创新转型
查看>>
大数据这么火,用途到底在哪?
查看>>
高温桑拿天如何让机房降温
查看>>
【博文推荐】如何做好大型数据中心的运维
查看>>
【最佳实践】如何使用云监控+日志服务快速完成故障发现和故障定位
查看>>
Windows 10更新车祸现场 老司机又要飙车了
查看>>
浪潮NF5568M4落地猿题库 让机器老师更智能
查看>>
Javascript设计模式理论与实战:桥接模式
查看>>
JAVA语法糖“+”运算符
查看>>