1,什么情况下出现死锁
2,以下代码 如何完善更好!
struct MyData
{
public string ip;
public string part;
public string time;
}
public void A()
{
Ds //数据源
foreach(DataRow dr in Ds.Tables[0].Rows)
{
MyData md = new MyData();
md.ip = dr["ip"].ToString();
md.part= dr["part"].ToString();
md.time= dr["time"].ToString();
ThreadPool.QueueUserWorkItem(new WaitCallback(JanitorMethod), md); //线程池
}
} private Object lockObj = new Object();
private void JanitorMethod(object ob)
{ MyData de_All = (MyData)ob;
Thread.Sleep(Convert.ToInt32(de_All.time));
lock (lockObj)
{ try
{
SocketService ss = new SocketService(de_All.ip, de_All.part, false);
StringBuilder sb = new StringBuilder("12312313");
ss.Write_DoWork(sb.ToString()); // 执行函数不用理睬
}
catch (Exception err)
{
throw err;
} }
}
2,以下代码 如何完善更好!
struct MyData
{
public string ip;
public string part;
public string time;
}
public void A()
{
Ds //数据源
foreach(DataRow dr in Ds.Tables[0].Rows)
{
MyData md = new MyData();
md.ip = dr["ip"].ToString();
md.part= dr["part"].ToString();
md.time= dr["time"].ToString();
ThreadPool.QueueUserWorkItem(new WaitCallback(JanitorMethod), md); //线程池
}
} private Object lockObj = new Object();
private void JanitorMethod(object ob)
{ MyData de_All = (MyData)ob;
Thread.Sleep(Convert.ToInt32(de_All.time));
lock (lockObj)
{ try
{
SocketService ss = new SocketService(de_All.ip, de_All.part, false);
StringBuilder sb = new StringBuilder("12312313");
ss.Write_DoWork(sb.ToString()); // 执行函数不用理睬
}
catch (Exception err)
{
throw err;
} }
}
解决方案 »
- 关于死机问题
- 麻烦帮帮忙给下面一段代码加个判断..本人新手不会加!!!
- 急~如何从datagridview中把被选中CheckBox的多行存入到LIST中?
- 继续放分!!!
- 想要在WEB上实现显示实时监控视频信息的显示,有什么好的建议,以前没做过这方面的
- 快救我:安装补丁后,发生“无法在Web服务器上启动调试,与Web服务器通信时出现身份验证错误”!
- EXCEL读取格式与丢失数据问题
- 怎么来获得服务器的时间啊?最好有源代码(WinForm)
- mail 为什么认证出错?
- .net中有没有和MSChart实现相同功能的控件
- 奇怪:byte = byte + byte 报类型转换错???
- dataset导入xml的问题
几个线程并发执行,都执行函数:JanitorMethod, 并访问MyData概率高的不行按你的理论,干脆别锁了!
锁的作用就阻止别的线程进入(它们等待),直到释放锁的对象,其他线程进入执行。
对于 你用锁的目的 不理解 try 和锁并用 ?
你是 锁 throw ?
我再看看
当锁同一个对象时,是不会出现死锁的情况。至于没锁住的情况,可能是其它的原因。可以写下测试代码试下。
好像你在 lock (lockObj)
{ try
{
SocketService ss = new SocketService(de_All.ip, de_All.part, false);
StringBuilder sb = new StringBuilder("12312313");
ss.Write_DoWork(sb.ToString()); // 执行函数不用理睬
}
catch (Exception err)
{
throw err;
} }
地方加锁不能反映你的目的,de_All这个对象,每一个都不一样。无需加锁。
ss.Write_DoWork(sb.ToString());这里要锁的话,那么在这里面锁可能代码更清晰些。
try
{
lock (this)
{
}
}互锁:
第一个线程没有释放,等待第二个线程资源。第二个线程也锁着,等待第一线程资源。