你好,我有两种方法可以处理相同的数据。方法LoadData()从文件加载/重新加载内存中的数据,并且很少调用它(仅在更新文件时)。方法GetData()从内存中获取数据,并且经常从许多不同的线程中调用它。
我想实现以下行为:
开始执行LoadData()时,阻止尝试执行GetData()的新线程,然后等待直到当前执行GetData()的线程完成执行,然后继续执行LoadData()并在完成时取消阻止以前被阻塞的线程。就是这样。
private Object _LoadDataLock;
public void LoadData()
lock (_LoadDataLock) {
{
// (1.) Block new executions of GetData();
// (2.) Wait threads currently executing GetData() to complete its execution.
// (3.) Do some work ..... Loading from files.
// (4.) Unblock blocked in (1.) threads.
}
}
public IDictionary GetData(string key1, string key2)
{
//Do something....
retrn data;
}
如何使用C#实现该行为?
谢谢。 伊万
答案 0 :(得分:1)
您需要在方法的调用周围加上mutual-exclusion。互斥目标是某个对象。因此,您需要在表达式语句中使用相同的对象x
。
您可以将Lock与代码块一起使用:
lock (x)
{
// Your code...
}
或者如果您不想使用代码块,则可以使用Monitor
:
Monitor.Enter(x);
// Your code...
Monitor.Exit(x);
答案 1 :(得分:1)
对于ReaderWriterLock来说,这听起来不错,它允许一个作者但可以有多个读者。
private ReaderWriterLock _lock;
public void LoadData()
{
_lock.AcquireWriterLock();
try
{
// Do some work ..... Loading from files.
}
finally
{
_lock.ReleaseWriterLock()
}
}
public IDictionary GetData(string key1, string key2)
{
_lock.AcquireReaderLock();
try
{
//Do something....
return data;
}
finally
{
_lock.ReleaseReaderLock()
}
}