我有一个多线程应用程序。我的问题是,有时我得到一个错误,例如程序无法访问文件,因为它被其他东西(应用程序的其他部分)使用。
现在我所做的就是捕获异常并在100ms延迟后重复该任务。
它正在运行,因为应用程序不会经常打开文件,并且只是在短时间内打开文件。
虽然我对这个解决方案不满意,因为它很难看,但它仍然可能出错。
有什么好方法可以解决这个问题吗?如果没有任何简单的答案,你需要更多关于应用程序的信息(什么文件,我可能在同一时间访问的原因)我可以回答,我只是试着让问题简单,通用。
此致 丹尼尔
编辑:
我做了一些快速的事情,你们对这个解决方案有什么看法,它不是最通用的,但是现在没有更好的想法:
当程序尝试写入文件时,检查它是否被使用。如果使用它,则在应用程序想要再次写入文件并且文件可以自由插入所有数据时,在内存中收集数据。
它仍然不是最好的,但它可能会提供更多的想法。
答案 0 :(得分:3)
由于您的应用程序正在读取和写入文件,因此您需要做的就是跟踪应用程序正在使用哪些文件。保留由文件名键入的R/W locks字典。当您去访问文件时,请取出相应的锁。
以下是编码方式:
Dictionary<string, ReaderWriterLockSlim> lockDict = new Dictionary<string, ReaderWriterLockSlim>();
ReaderWriterLockSlim LockFile(string filename, bool readOnly)
{
var fullPath = System.IO.Path.GetFullPath(filename);
ReaderWriterLockSlim myLock;
// lock the dictionary while we're accessing it
lock (lockDict)
{
if (!lockDict.TryGetValue(fullPath, out myLock))
{
myLock = new ReaderWriterLockSlim();
lockDict[fullPath] = myLock;
}
}
// only block on the file lock once the dictionary is unlocked
if (readOnly)
myLock.EnterReadLock();
else
myLock.EnterWriteLock();
// file is now "locked", so caller can proceed with read/write, then unlock
return myLock;
}
你可以像这样使用它:
// block until we're not using the file anymore
var myLock = LockFile(filename, readOnly: false);
try
{
using (var file = new StreamWriter(filename))
{
...
}
}
finally
{
myLock.ExitWriteLock();
}