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

关于List 的线程保险(道者有分),不知小弟这样写是否可以。请大家多指教

2013-07-04 
关于List 的线程安全(道者有分),不知小弟这样写是否可以。。。请大家多指教/*1.定义一个书本类*/public class

关于List 的线程安全(道者有分),不知小弟这样写是否可以。。。请大家多指教
/*1.定义一个书本类*/
public class TBook{
  public string BookNo="";
  public string BookName="";
  public string BookPictureURL="";//书本封面图url
  // ....
}

/*2.书本链表*/
public class TBookList : List<TBook>{

        //提供线程线程安全方案:Lock、UnLock
        public void Lock()
        {
            Monitor.Enter(this);
        }
        public void Unlock()
        {
            Monitor.Exit(this);
        }//end of //提供线程线程安全方案:Lock、UnLock


        //使用线程安全添加书本,不知这样是否可以
        public void AddBook(TBook b)
        {
            this.Lock();//加锁,这样能否确保线程安全?
            try
            {
                Add(b);
            }
            finally { this.Unlock(); }
        }
        
       //通过编号获取书本信息
        public TBook NoOfBook(string aBookNo){
          TBook b= new TBook();
          this.Lock();//加锁,不知这样使用能否确保线程安全???
          try{
             for(int iLoop=0; iLoop<this.Count; iLoop++){
                b=this[iLoop];
                if (b.BookNo==aBookNo) return b;
             }
          }finall{this.UnLock(); /*解锁*/ }
          
          return b; //返加没有编号的TBook,表示NoOfBook失败
       }

}

//向想大家请教下使用Monitor.Enter和Monitor.Exit,即上面的Lock和UnLock....这样能否可以确保线程安全。。。如果不行的话,有什么样的方案比较好能确保TBookList线程安全 关于List线程安全 Monitor
------解决方案--------------------


脱裤子放屁——多此一举

就正常使用就可以了,何必要自己添麻烦
lock(((ICollection)this).SyncRoot)
{
   //...
}
[解决办法]
好好理解回复者的内容,你就学到技术了
[解决办法]
http://msdn.microsoft.com/zh-cn/library/c5kehkcz(v=vs.80).aspx
我还是比较推荐这种
我不知道你的是否能成功~
[解决办法]
关于List 的线程保险(道者有分),不知小弟这样写是否可以。请大家多指教关于List 的线程保险(道者有分),不知小弟这样写是否可以。请大家多指教
[解决办法]
  Monitor.Enter(this);
不要this 生命一个object变量好一点。

你的想法是可以达到线性安全调用的。


[解决办法]

引用:
关键是我外部类也会调用TBookList 。。。。所以必须自已实现锁
bList.Lock();
try{
  for(int iLoop=0; iLoop< bList.Count; iLoop++){
    // .....
  }
}
finally{ bList.UnLock(); }


你那样封装出来,其实就跟lock(this)一样,最好是定义一个private对象作为互斥量
你可以用reflector看一下.net封装好的http://msdn.microsoft.com/zh-cn/library/vstudio/ms668265.aspx
[解决办法]
感觉LZ写的还可以,何必怎么喷
[解决办法]
引用:
你好:dongxinxi ,请问我这样定义书本链表 书本链表TBookList 会不会好一点呢?
/*2.书本链表*/
 public class TBookList : SynchronizedCollection<TBook>{
      private readonly object thisLock= new object;}


你可能没有好好看MSDN,SynchronizedCollection这个类已经将同步量封装为属性SyncRoot了
父类已经封装好了的,如果你不需要在此基础上实现额外的功能,那你直接使用SynchronizedCollection这个就好了,没必要去继承
[解决办法]
你可以用reflector打开System.ServiceModel.dll库,看一下人家是怎么设计的

热点排行