如何正确同步这些线程?

时间:2016-06-29 02:58:37

标签: c# multithreading locking monitor

我试图正确处理网络应用中的文件。下载文件时,我锁定了一个对象:

lock(lockObject)
{
   //Download file here.
}

因此,如果在下载过程中将要从另一个线程删除同一个文件,那么"删除"线程等待"下载"线程首先完成:

lock(lockObject)
{
   //Delete file here.
}

这有效,但是存在另一个问题:两个线程无法同时下载文件。

我怎样才能让多个线程运行"下载"代码同时但不允许任何线程运行"删除"代码直到"下载"线程完成了?

我知道答案在Monitor课程的某个地方,但我不确定如何将其拉下来。

1 个答案:

答案 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();
    }
}