我的一个类的一个方法,外部会调用,并且外部可能是多个,我希望互斥调用,如下:
public string GetResult(string commstr,int SocketNum,int ReceiveType)
{
lock(this)
{
......//相互斥的代码段
......
......
}
}
或者
public string GetResult(string commstr,int SocketNum,int ReceiveType)
{
try
{
Monitor.Enter(this)
......//相互斥的代码段
......
......
}
finally
{
Monitor.Exit(this);
}
}以上两种通过我测试发现,并没有实现互斥调用,为什么?
求助各位大哥,呵呵!

解决方案 »

  1.   

    这里有些例子,你下载一下,看一下吧:线程--分别用lock以及Interlicked和Monitor类实现线程的临界区操作(互斥):
    http://blog.csdn.net/chengking/archive/2005/11/30/540644.aspx
      

  2.   

    如下可以互斥调用:
    public static Mutex mt=new Mutex(false)
    ......
    ......mt.WaitOne();
    Thread.sleep(10);
    ......    //想互斥执行的程序段
    ......
    mt.ReleaseMutex( );---------------
    但是有一个严重问题:如果某一个外部用户的调用死了(即不能顺利退出),那么所有的外部调用都将得不到响应。这个问题很严重啊,一颗老鼠屎害一锅饭,老板肯定不允许的。呵呵,各位老大,帮忙啊!!
      

  3.   

    你确定他们lock的"this"是同一个东西?如果你要在同一个类的范围内lock,应该用 lock(typeof(类名))
      

  4.   

    另外,如果所谓的“外部”是同一个线程,从第二个lock开始,都不会阻塞线程。
      

  5.   

    static object syncroot = new object();public string GetResult(string commstr,int SocketNum,int ReceiveType)
    {
    lock(syncroot)
    {
    ......//相互斥的代码段
    ......
    ......
    }
    }
      

  6.   

    static object syncroot = new object();public string GetResult(string commstr,int SocketNum,int ReceiveType)
    {
    lock(syncroot)
    {
    ......//相互斥的代码段
    ......
    ......
    }
    }
    =========================
    加上以后,获取这段代码很慢,1个外部进程测试时,基本是1秒才能获得一次,2个外部进程测试时,基本是2秒才能获得一次,。。
    这好象太慢了吧?
      

  7.   

    >>> 1个外部进程测试时,基本是1秒才能获得一次,2个外部进程测试时,基本是2秒才能获得一次
    那你测试一下执行这段代码一次需要花多少时间,没有并发的情况下
      

  8.   

    速马大哥,我这段代码执行用不了那么多时间的!
    用mt=new Mutex(false)这种方法来实现互斥调用就没有这么慢,一称之内平均有三、四外部测试进程能获得执行权!我还是Mutex这种方法了!感谢各位大哥帮助!