我试图正确处理网络应用中的文件。下载文件时,我锁定了一个对象:
lock(lockObject)
{
//Download file here.
}
因此,如果在下载过程中将要从另一个线程删除同一个文件,那么"删除"线程等待"下载"线程首先完成:
lock(lockObject)
{
//Delete file here.
}
这有效,但是存在另一个问题:两个线程无法同时下载文件。
我怎样才能让多个线程运行"下载"代码同时但不允许任何线程运行"删除"代码直到"下载"线程完成了?
我知道答案在Monitor
课程的某个地方,但我不确定如何将其拉下来。
答案 0 :(得分:1)
可能ReaderWriterLockSlim可以满足您的需求。基本上,您将下载线程视为读取器,将删除线程视为编写器。您可以拥有任意数量的读者,但任何作家都需要独占访问权限。因此,如果删除方法调用EnterWriteLock
时正在下载任何文件,则删除线程必须等到所有当前下载完成。
ReaderWriterLockSlim theLock = new ReaderWriterLockSlim();
void Delete(filename)
{
theLock.EnterWriteLock();
try
{
// do delete stuff here
}
finally
{
theLock.ExitWriteLock();
}
}
void Download(filename)
{
theLock.EnterReadLock();
try
{
// do delete stuff here
}
finally
{
theLock.ExitReadLock();
}
}