【问题标题】:Lock based on a flag基于标志的锁定
【发布时间】:2019-07-11 11:25:45
【问题描述】:

我想根据 App 配置中的 flag 锁定几行代码。因此,基于 flag 我是否异步运行应用程序。所以我需要通过检查flag 来锁定几行代码的执行。所以我需要重复编写代码。下面是示例

if (flag) {
    lock(dataLock){
        //few lines of code
    }
} else {
    //repeat the above code gain here (few lines of code)
}

有没有其他方法可以保存我的重复代码。

【问题讨论】:

  • 把锁放在if上方怎么样?所以整个 if 将被包裹在锁中。
  • 如果我将标志检查包裹在锁中,那么我相信它总是会被锁定。我想根据标志来决定是否锁定。如果我错了,请告诉我。
  • 我的错。我认为您应该将 "//在此处重复上述代码增益(几行代码)" 包装到一个方法中。
  • 使用方法是一种解决方案,但我想知道有没有其他最好的方法来实现它。谢谢!!

标签: c# multithreading if-statement locking


【解决方案1】:
if (flag)
    Monitor.Enter(dataLock);

// few lines of code

if (Monitor.IsEntered(dataLock))
    Monitor.Exit(dataLock);

【讨论】:

    【解决方案2】:

    使用 Monitor.Enter 代替 Lock() {} ?使用 if 语句进入和退出。

    【讨论】:

      【解决方案3】:

      您可以在 lock 甚至在 else 语句中使用您的外包代码调用函数。这至少会减少您的开销和重复代码。

      if(flag==true){
          lock(dataLock){
              fewLines();
          }
      }else{
          fewLines();
      }
      
      

      [...]

      public void fewLines(){
         // put your few lines here.
      }
      

      这将从锁定的上下文中运行函数。

      【讨论】:

        【解决方案4】:

        Monitor.Enter 方法是最好的,但您也可以这样做:

        Action fewLinesOfCode = () =>
        {
            //few lines of code
        };
        
        if (flag)
        {
            lock (dataLock)
            {
                fewLinesOfCode();
            }
        }
        else
        {
            fewLinesOfCode();
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-06-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-03-22
          • 1970-01-01
          相关资源
          最近更新 更多