如何正确同步这些线程?
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();
}
}
我正在尝试正确处理网络应用程序中的文件。下载文件时我锁定了一个对象:
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();
}
}