急!c#死锁问题 monitor.enter就是排斥,如果里面出现异常,然后不执行monitor.exit话。下个线程再来就不能进入该程序了。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 是资源请求不到还是什么啊?内存占用多少,CPU占用多少这个程序主要是干嘛用的 程序是发送TCP报文的,Cpu,内存没变化,而且任务管理器中显示程序没"停止响应",另外问一句如果由于异常导致没有monitor.exit,我的程序是在IDE下运行的应该能捕捉到呀 有个可能是死锁,线程A锁定资源a请求资源b,线程B锁定资源b请求资源a就死了.不过你程序里就用了一个临界区的话是不会死锁的 发送TCP============================是不是send或者recieve时候阻塞了 是呀,在send子程序的monitor.enter(this)里过不去了,请问是怎么回事,谢谢了 楼上lock和monitor是一码事,只不过lock可以强制退出. 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; } 你在send,recieve前要poll一下看看socket能不能使用,否则recieve阻塞的话,那个线程已经进入了Monitor.Enter(this);所以Send这个方法就要在Monitor.Enter(this); 阻塞 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 对象变量来保护所有实例所共有的数据。 WinForm里面如何嵌入Excel? 如何一下子关闭多个对话框? C# 如何让Datagridview处于不活动状态 为什么有些论坛里面的文章能直接在百度Google搜到呢,怎么做的请问 c#服务无法启动的调试错误信息,请多多指教 那位delphi、C#双料高手能把这段delphi代码转换成c#,在下感激不尽 创想MT网店系统2009年终极版V2.4.0发布 请问:如何在C#中取字符的ASC码,如何由ASC码返回字符 如何处理与上司的关系? printDocument 打印图片分辨率问题 有沒有哪位朋友用 NBear和Remoting 做項目的呢 怎么用C#2005做OA系统?
是资源请求不到还是什么啊?内存占用多少,CPU占用多少这个程序主要是干嘛用的
不过你程序里就用了一个临界区的话是不会死锁的
============================
是不是send或者recieve时候阻塞了
{
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;
}
试一下
lock 确保当一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放。线程处理(C# 编程指南) 这节讨论了线程处理。lock 调用块开始位置的 Enter 和块结束位置的 Exit。通常,应避免锁定 public 类型,否则实例将超出代码的控制范围。常见的结构 lock (this)、lock (typeof (MyType)) 和 lock ("myLock") 违反此准则:如果实例可以被公共访问,将出现 lock (this) 问题。如果 MyType 可以被公共访问,将出现 lock (typeof (MyType)) 问题。由于进程中使用同一字符串的任何其他代码将共享同一个锁,所以出现 lock(“myLock”) 问题。 最佳做法是定义 private 对象来锁定, 或 private shared 对象变量来保护所有实例所共有的数据。