monitor.enter就是排斥,
如果里面出现异常,然后不执行monitor.exit话。
下个线程再来就不能进入该程序了。

解决方案 »

  1.   


    是资源请求不到还是什么啊?内存占用多少,CPU占用多少这个程序主要是干嘛用的
      

  2.   

    程序是发送TCP报文的,Cpu,内存没变化,而且任务管理器中显示程序没"停止响应",另外问一句如果由于异常导致没有monitor.exit,我的程序是在IDE下运行的应该能捕捉到呀
      

  3.   

    有个可能是死锁,线程A锁定资源a请求资源b,线程B锁定资源b请求资源a就死了.
    不过你程序里就用了一个临界区的话是不会死锁的
      

  4.   

    发送TCP
    ============================
    是不是send或者recieve时候阻塞了
      

  5.   

    是呀,在send子程序的monitor.enter(this)里过不去了,请问是怎么回事,谢谢了
      

  6.   

    楼上lock和monitor是一码事,只不过lock可以强制退出.
      

  7.   

     public int SendRawData(int nID,byte[] pData) 
            {  
                Output("【下行】"+GKCommonMethod.BytesToStringBy16(pData));
                TestOutput(pData);
                int nBack = 0;
                IPEndPoint ipe = m_htClient.Get(nID);
                try{
                if (ipe == null)
                {
                    nBack = 0xCF;
                    Output("【下行失败】"+nID.ToString() + "未登录");
                }
                else
                {
                    try
                    {
                        Monitor.Enter(this);  //有问题在这里,程序死后,强行中断就跳到这里了,并且无法继续执行
                        bool bBack = m_SocketServer.SendRawData(ipe.Address.ToString(), ipe.Port, pData);
                        if (bBack)
                        {
                            Output("【下行成功】");
                        }
                        else
                        {
                            //删除失效连接
                            m_htClient.Remove(nID);
                            m_htBuffer.Remove(ipe);
                            //掉线报警                       
                            Output("【下行失败】" + nID.ToString() + "掉线");
                            nBack = 0xCE;
                            GKRTULamp rtu = RealTimeDataCenter.GetRTU(nID);
                            if (rtu != null)
                            {
                                rtu.IsOnline = false;
                            }
                        }
                    }
                    catch (Exception oBug)
                    {
                        m_htClient.Remove(nID);
                        m_htBuffer.Remove(ipe);
                        Output("【下行错误】" + oBug.ToString());
                        nBack = 0xCD;
                    }
                    finally { Monitor.Exit(this); }
                }
            }
            catch { GKCommonMethod.OutputDebugTxt("SendRawData error " + "  pData=" + System.BitConverter.ToString(pData)); };
                return nBack;
            }    
      

  8.   

    你在send,recieve前要poll一下看看socket能不能使用,否则recieve阻塞的话,那个线程已经进入了Monitor.Enter(this);所以Send这个方法就要在Monitor.Enter(this); 阻塞
      

  9.   

    Monitor.Enter( m_SocketServer)
    试一下
    lock 确保当一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放。线程处理(C# 编程指南) 这节讨论了线程处理。lock 调用块开始位置的 Enter 和块结束位置的 Exit。通常,应避免锁定 public 类型,否则实例将超出代码的控制范围。常见的结构 lock (this)、lock (typeof (MyType)) 和 lock ("myLock") 违反此准则:如果实例可以被公共访问,将出现 lock (this) 问题。如果 MyType 可以被公共访问,将出现 lock (typeof (MyType)) 问题。由于进程中使用同一字符串的任何其他代码将共享同一个锁,所以出现 lock(“myLock”) 问题。 最佳做法是定义 private 对象来锁定, 或 private shared 对象变量来保护所有实例所共有的数据。