日期:2014-05-17  浏览次数:20741 次

请教一个Lock语法问题.
我定义了一个DataTable.多线程访问这个DataTable.会报错,我查询了一下,推荐在操作DataTable之前,用Lock锁住DataTable.


public static DataTable dt= new DataTable();

然后我在多个线程中,是这样操作的

 lock(dt)
    {
        ...........
    }




请家这样的用法对吗,我查看了一下,Lock是锁不住pbulic的变量的,请教各位,有没有更好的方法互斥访问DataTable.

------解决方案--------------------
object syncLock = new Object();

访问DataTable的线程中
Lock(syncLock)
{
   // ...
}
------解决方案--------------------
Lock是锁不住pbulic的变量的
从来没有听过这个说法,应该是其他原因 
查了下错误信息,貌似是lock里面更新了dt的信息?
可以考虑另外加锁,别锁dt了。
public static object lockthis = new object ();都行
------解决方案--------------------
锁改变dt的操作

dt操作函数()
{
lock(this)
{
   操作行为

}
}
------解决方案--------------------
通常,应避免锁定 public 类型,否则实例将超出代码的控制范围。 常见的结构 lock (this)、lock (typeof (MyType)) 和 lock ("myLock") 违反此准则:
如果实例可以被公共访问,将出现 lock (this) 问题。
如果 MyType 可以被公共访问,将出现 lock (typeof (MyType)) 问题。
由于进程中使用同一字符串的任何其他代码都将共享同一个锁,所以出现 lock("myLock") 问题。
最佳做法是定义 private 对象来锁定, 或 private static 对象变量来保护所有实例所共有的数据。
class Account
    {
        decimal balance;
        private Object thisLock = new Object();

        public void Withdraw(decimal amount)
        {
            lock (thisLock)
            {
                if (amount > balance)
                {