static DataTable Cache;
.....
 public static DataRow GetRow(string deviceId)
        {
            lock (Cache)
            {
                if (Cache.Rows.Count == 0) return null;
                string filter = string.Format("(Device not like '%{0}%' or Device ='') and Lock = 0", deviceId);
                DataRow[] row = Cache.Select(filter, "Priority desc");
                if (row == null || row.Length == 0) return null;
                
                if (row[0]["Lock"].Equals(0))
                {
                    row[0]["Lock"] = 1;
                    return row[0];
                }
                return null;
            }   
        }....
SendMessage(DataRow row)
{....只取数据处理,数据库操作...}
两个线程调用静态方法GetData,取Cache中一条数据处理(每条数据只能被一个线程处理)运行程序,发现两个线程处理同一条数据的问题,求解决方案?

解决方案 »

  1.   

    通常,最好避免锁定 public 类型或锁定不受应用程序控制的对象实例。例如,如果该实例可以被公开访问,则 lock(this) 可能会有问题,因为不受控制的代码也可能会锁定该对象。这可能导致死锁,即两个或更多个线程等待释放同一对象。出于同样的原因,锁定公共数据类型(相比于对象)也可能导致问题。
      

  2.   

    你只锁住了对DataTable的访问。但2个线程操作同一条记录,这是逻辑问题。要么锁表,要么,你取数据后,吧数据某个字段标注一下,editing
      

  3.   

    row[0]["Lock"] = 1;
    "(Device not like '%{0}%' or Device ='') and Lock = 0"
      

  4.   

    lock锁住的是堆内存首地址。没锁住row的地址。
      

  5.   


    问题是,我不对row进行edit操作
    lock(Cache) 是否保证每次只能有一个线程进入方法体取row