在C#中,如何在另一个方法执行时锁定方法的执行而没有自锁?

时间:2019-09-15 17:48:46

标签: c# multithreading

你好,我有两种方法可以处理相同的数据。方法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#实现该行为?

谢谢。 伊万

2 个答案:

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