日期:2014-05-18  浏览次数:20866 次

Monitor类的访问可以在何时访问呢?Thread2在委托可以在Monitor.Exit()之前进入嘛?
using   System
using   System.Threading;//

namespace   ThreadExample
{//
class   FileAccess//
{
public   void   WriteData(string   Data)
{//
Monitor.Enter(this);// //Console.WriteLine( "文件访问.写入数据--开始 ");
//Console.WriteLine( "文件访问.写入数据--工作 ");
for(int   cnt=0;cnt <10;cnt++)
{
Console.Write(Data);
}
//Console.WriteLine( "文件访问.写入数据--结束 ");
Console.WriteLine( "....................... ");
Monitor.Exit(this);//释放监视锁
}
}
class   ThreadMonitorclass//定义一个其他类
{
public   static   FileAccess   Fd=new   FileAccess();//声明一个静态类的对象Fd

public   static   void   ChildThread1()//定义静态方法1将来被委托调用
{
Console.WriteLine( "子线程#1开始 ");
//Console.WriteLine( "子线程#1调用.文件访问写入 ");
Fd.WriteData( "T1 ");

Console.WriteLine( "子线程#1--从输出返回 ");
}
public   static   void   ChildThread2()
{
Console.WriteLine( "子线程#2--开始 ");
//Console.WriteLine( "子线程#2--开始调用文件访问写入数据 ");
Fd.WriteData( "T2 ");

Console.WriteLine( "子线程#2--从输出开始返回 ");
}
public   static   void   Main()
{
ThreadStart   Child1=new   ThreadStart(ChildThread1);
ThreadStart   child2=new   ThreadStart(ChildThread2);

//Console.WriteLine( "主---创建子线程 ");

Thread   Thread1=new   Thread(Child1);
Thread   Thread2=new   Thread(child2);

Thread1.Start();
Thread2.Start();
Console.ReadLine();
}
}
}

------解决方案--------------------
如果2个线程同时调用

Monitor.Enter(this);
。。。。。
Monitor.Exit(this);


段落时,只有一个线程能进入,在结束之前,另外一个线程无法进入

还有,象你这样的情形,使用lock(this)比较好,或者你要坚持手写Monitor方法的话,最好使用try/finally

Monitor.Enter(this);
try
{

}
finally
{
Monitor.Exit(this);
}