首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

请问一个Lock语法有关问题

2013-08-04 
请教一个Lock语法问题.我定义了一个DataTable.多线程访问这个DataTable.会报错,我查询了一下,推荐在操作Da

请教一个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)
                {


                    throw new Exception("Insufficient funds");
                }
                balance -= amount;
            }
        }
    }

热点排行