Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# “同步原语”;“锁定一次”;_C#_.net_Parallel Processing - Fatal编程技术网

C# “同步原语”;“锁定一次”;

C# “同步原语”;“锁定一次”;,c#,.net,parallel-processing,C#,.net,Parallel Processing,我需要一个同步原语,它类似于监视器,但不需要像我输入它那样多次退出它。如果我通过一个线程进入Monitor,然后通过同一个线程重新进入它,我将需要调用Monitor.Exit两次。但我需要一个电话退出 现在我使用了一种监视器包装器,如果当前线程已经输入了它,它就不会进入监视器(这就是为什么我可以通过一次调用退出它)。但是.NET Framework可能包含一个吗?我很想知道为什么您会调用监视器。在调用监视器的次数相同的情况下多次输入。退出。通常,任何此类同步代码如下所示: try { M

我需要一个同步原语,它类似于监视器,但不需要像我输入它那样多次退出它。如果我通过一个线程进入Monitor,然后通过同一个线程重新进入它,我将需要调用Monitor.Exit两次。但我需要一个电话退出


现在我使用了一种监视器包装器,如果当前线程已经输入了它,它就不会进入监视器(这就是为什么我可以通过一次调用退出它)。但是.NET Framework可能包含一个吗?

我很想知道为什么您会调用
监视器。在调用
监视器的次数相同的情况下多次输入
。退出
。通常,任何此类同步代码如下所示:

try
{
    Monitor.Enter(lockObject);
    // some code that needs to be synchronized
}
finally
{
    Monitor.Exit(lockObject);
}
假设您正在使用
尝试
/
最后
无论您在哪里使用
监视器获得锁。输入
(您应该是),我很难理解为什么您需要这个“锁一次”类

事实上,您基本上不必自己做这件事,因为做基本相同事情的更简单方法是使用
lock
语句:

lock (lockObject)
{
    // some code that needs to be synchronized
}

也就是说,我肯定是遗漏了什么。

我很好奇你为什么会调用
监视器。在没有相同次数调用
监视器的情况下多次输入
。退出
。通常,任何此类同步代码如下所示:

try
{
    Monitor.Enter(lockObject);
    // some code that needs to be synchronized
}
finally
{
    Monitor.Exit(lockObject);
}
假设您正在使用
尝试
/
最后
无论您在哪里使用
监视器获得锁。输入
(您应该是),我很难理解为什么您需要这个“锁一次”类

事实上,您基本上不必自己做这件事,因为做基本相同事情的更简单方法是使用
lock
语句:

lock (lockObject)
{
    // some code that needs to be synchronized
}

也就是说,我肯定会遗漏一些东西。

您如何知道它是同一个线程,以及如何确保当这个线程离开时,它将在离开前调用exit

从外观上看,您只需要有锁的其他东西(在外层)。也许是一个“入口点”方法,它可以锁定并调用另一个具有关键工作的方法,然后您可以多次调用另一个方法,而无需通过锁定

public static void MethodOne()
{
  lock (lockObj)
  {
    MethodTwo();
  }
}

private static void MethodTwo()
{
  //This method can be called multiple times
  //without going past MethodOne and so you only
  //lock once
}

private static void MethodThree()
{
}

您如何知道它是同一个线程,以及如何确保当这个线程离开时,它将在离开之前调用exit

从外观上看,您只需要有锁的其他东西(在外层)。也许是一个“入口点”方法,它可以锁定并调用另一个具有关键工作的方法,然后您可以多次调用另一个方法,而无需通过锁定

public static void MethodOne()
{
  lock (lockObj)
  {
    MethodTwo();
  }
}

private static void MethodTwo()
{
  //This method can be called multiple times
  //without going past MethodOne and so you only
  //lock once
}

private static void MethodThree()
{
}

不是答案,但是:可重入锁不是一个好主意。。。例如,Microsoft允许您将ReaderWriterLockSlim(ReaderWriterLockSlim)配置为递归输入,但他们也认为这不是一个好主意。不是答案,但是:可重入锁不是一个好主意。。。例如,Microsoft允许您将ReaderWriterLockSlim(ReaderWriterLockSlim)配置为递归输入,但他们也认为这不是一个好主意。这可能是递归函数的情况,当您只需要锁定第一个条目时,也可能是递归函数的情况,当您只需要锁定第一个条目时。