如果线程池里有N个线程,都会触发同一个事件(或调用同一个方法),如何确保事件只被其中一个线程触发(调用),等其触发完毕,事件被处理后,再轮到其他线程去触发该事件呢?方法也是同样的处理方式...

解决方案 »

  1.   

    use Mutex or Lock 
    Sample code as follows:
    //Use lock keyword
    private void FunUnique( )
    {
        lock(this)
        {
               //Do what you want here
         }
    }//Use mutex classs
    private Mutex mUnique = null;
    private void FunUnique()
    {
           if( mUnique == null ) mUnique = new Mutex();
           mUnique.WaitOne();
           //Do what you want here
           mUnique.ReleaseMutex();
    }
      

  2.   

    to Knight94(愚翁):想问一下关于Lock的参数的问题,
    “lock(expression),lock 语句的表达式必须表示一个引用类型的值。”ArrayList myList;private void test()
    {
       lock(myList)   
       {   
          ClientList.Add(XXX);   
       }   
       Console.WriteLine("hello world");
    }上面的语句是不是表示只锁住了myList这个对象?如果A线程和B线程都调用到test(),但A先获得了myList的互斥锁对myList进行修改,那么B就无法修改myList,但是否可以执行后面的Console.WriteLine()呢?如果上面的程序该成private void test()
    {
       lock(myList)   
       {   
          ClientList.Add(XXX); 
          Console.WriteLine("hello world");  
       }   
    }执行结果又会怎么样?你给出的示例中的lock(this)又表示什么意思?我还是对lock或者Mointer.Entry()所传的参数感到很迷惑
      

  3.   

    是不是无论lock传入什么参数,{}内的语句都将比锁住知道解锁为止?呵呵本人异常菜,所问的问题都很低级,希望高手们不吝赐教!
      

  4.   

    lock (obj) {  ...}相当于:
    Monitor.Enter(obj);
    try{
    ...
    } finally {
    Monitor.Exit(obj); // 这一行在上面的代码出错的时候也会执行
    }Monitor.Enter(obj)的作用是获取在obj上的排他锁
    但是如果锁已经被其它线程获取了,这个调用就会暂时死掉(术语叫“阻塞”),直到其它线程放开,本线程终于能获取排他锁的时候才会返回所以你的问题:“B就无法修改myList,但是否可以执行后面的Console.WriteLine()呢?”因为B过程在lock处阻塞了,所以后面的Console.WriteLine也暂时无法执行。要注意的是,虽然某个对象,例如myList被锁住了,但是如果过程C不尝试锁它而直接操作,例如myList.Clear(),就仍然可以成功,这时候A和B就可能会出错了,因为A和B试图独占使用权的myList被其它线程修改了
      

  5.   

    关于集合的锁定说太多了,回到你在标题上的问题,假设某方法是
    private void DoSomething() {
      ...
    }那么要使这个方法每次只能由一个线程调用的方法就是private readonly object DoSomethingLock = new object();
    private void DoSomething() {
      lock (DoSomethingLock) {
        ...
      }
    }为什么不lock其它东西,例如this?因为要尽可能减低lock互相冲突的可能性,找个不影响其它lock的东西来lock,例如特别为这个方法准备的一个空对象DoSomethingLock
      

  6.   

    to netmicro(麦):很高兴在这个帖子里又见到你,从你的回复里学到了不少东西,谢谢!