大哥大姐们好,小弟现在在做一个多线程程序,下面有一个helper性质的class:
FileAccessHelper{
 void OpenFile(); void updateFile(); void DeleteFile();  }
所有文件访问基本都是通过这个class中的方法来进行的,现在就有问题了,比如thread A通过OpenFile打开文件的过程中,thread B也在这个时候updateFile()访问同一个文件,就会出现file is being used by another process exception。
现有的方法:
1) 用lock锁住: 不行!  因为前面说了,这个helper class会被所有的thread使用,要是lock住一个方法的话,所有的都要wait,而我只要是lock同一个文件就行了。
2) 用下面这种方法,可以降低出exception的概率,但是还是会有,而且性能也会很受影响。
For(i=10){
  try {// 文件访问}  catch{thread.sleep(1000);}
   
}大家有啥好点子不?多谢谢了吖。

解决方案 »

  1.   

    //仅参考
        private static List<string> lockFiles = new List<string>();
        public void OpenFile()
        {
            string fileName = "...";
            while (lockFiles.Contains(fileName))
            {
                Thread.Sleep(100);
            }        lockFiles.Add(fileName);
            //do open..
            lockFiles.Remove(fileName);
        }
        public void updateFile()
        {
            string fileName = "...";
            while (lockFiles.Contains(fileName))
            {
                Thread.Sleep(100);
            }        lockFiles.Add(fileName);
            //do update..
            lockFiles.Remove(fileName);
        }
      

  2.   

    采用阻塞读,或者阻塞写
    独占方式操作文件lock
    创建一个写入队列。启动线程
    考虑CPU,读文件和写文件,多线程不一定能更快