大哥大姐们好,小弟现在在做一个多线程程序,下面有一个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);}
}大家有啥好点子不?多谢谢了吖。
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);}
}大家有啥好点子不?多谢谢了吖。
解决方案 »
- 急球,怎么用循环语句给dropdowlist赋值
- 请教关于修改文章时,其中的Dropdownlist问题
- 数据库中是Bit型 服务器上我该用什么类型来接收
- 数据表互传
- 请问如何找到已知记录的上一条记录和下一条记录
- 为什么在datagrid里使用删除列,点2次删除datagrid才正常显示
- 求js无限分类树代码
- 我把一个web程序考到机子上,然后访问,为什么在自己的机器上都不能访问呢.
- ****各位来救急:DataView的RowFilter老是出问题
- 紧急求问 :vs.net 2005 开发过程中调用用户控件中的服务器控件的时候 报:不可访问,受保护级别的限制!
- gridview怎么插入一行数据!急!在线等!
- linq to DataSet 如何执行sql语句 来查询
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);
}
独占方式操作文件lock
创建一个写入队列。启动线程
考虑CPU,读文件和写文件,多线程不一定能更快