如何正确同步这些线程?

How to properly synchronize these threads?

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

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

这样,如果在下载过程中同一文件即将从另一个线程中删除,"delete" 线程会等待 "download" 线程先完成:

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

这可行,但会出现另一个问题:两个线程无法同时下载文件。

如何让多个线程可以同时 运行 "download" 代码,但同时不允许任何线程 运行 "delete" 代码直到 "download" 个线程完成?

我知道答案在 Monitor class 的某处,但我不确定如何实现它。

可能 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();
    }
}