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;
                }            }
        }

解决方案 »

  1.   

    顶咯,学习,你不是写lock了么
      

  2.   

    顶着有分,分不够再加!!!LOCK 写是写了,可 没锁住 : Thread.Sleep(Convert.ToInt32(de_All.time));也不知道 什么情况下会死锁!或 换个写法效率更好!或 锁还有问题
      

  3.   


    几个线程并发执行,都执行函数:JanitorMethod, 并访问MyData概率高的不行按你的理论,干脆别锁了!
    锁的作用就阻止别的线程进入(它们等待),直到释放锁的对象,其他线程进入执行。
      

  4.   

    我只是从代码里面看你的md,有可能出现这种情况,主线程的for在给md对象赋值,而threadpool中却还在占有md,还有你报的错是什么错误,你for里面会不会大于线程池的上届
      

  5.   

    单单 死锁来说  你的代码不会  的   不要小看 了  .net 的  GC(clr)
    对于 你用锁的目的 不理解  try 和锁并用 ?
    你是 锁 throw ?
    我再看看   
      

  6.   

    lock 是互斥锁
    当锁同一个对象时,是不会出现死锁的情况。至于没锁住的情况,可能是其它的原因。可以写下测试代码试下。
    好像你在 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());这里要锁的话,那么在这里面锁可能代码更清晰些。
      

  7.   

    有项目管理经验的.NET开发的朋友,可以加上限500人的QQ群28720769,一起交流。
      

  8.   

    要所在try里面
    try
    {
      lock (this)
      {

       }
    }互锁:
    第一个线程没有释放,等待第二个线程资源。第二个线程也锁着,等待第一线程资源。