Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.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_Multithreading - Fatal编程技术网

C# 等待句柄是否释放线程获取的锁?

C# 等待句柄是否释放线程获取的锁?,c#,.net,multithreading,C#,.net,Multithreading,当我有如下所示的代码时,我的问题是调用signal.WaitOne的线程是否释放为另一个线程获取锁而获取的锁?我想这是一个很琐碎的问题,但我试着搜索类似的东西,结果却一无所获。如果有人能对此有所了解,并修改我的帖子/标题,使其在将来更易于搜索,我将不胜感激 AutoResetEvent signal = new AutoResetEvent(false); foo() { Monitor.Enter(locker); try { // code if(co

当我有如下所示的代码时,我的问题是调用signal.WaitOne的线程是否释放为另一个线程获取锁而获取的锁?我想这是一个很琐碎的问题,但我试着搜索类似的东西,结果却一无所获。如果有人能对此有所了解,并修改我的帖子/标题,使其在将来更易于搜索,我将不胜感激

AutoResetEvent signal = new AutoResetEvent(false);

foo() {
  Monitor.Enter(locker);
  try {
       // code

       if(condition)
          signal.WaitOne();

       // code         
  } finally {
      Monitor.Exit(locker);
  }
}
编辑:我正在进行此编辑以供将来参考:

这似乎是一个更好的范例,我正在尝试这样做:

foo() {
  Monitor.Enter(locker);
  try {
       // code

       while(condition)
          Monitor.Wait(locker);

       // code         
  } finally {
      Monitor.Exit(locker);
  }
}

bar {
  lock(locker) {
      Monitor.Pulse(locker);
  }
}

否。在调用
Exit
之前,锁定一直保持。一般来说,你应该试着在拿着锁的时候不要阻塞。它增加了死锁的可能性。

信号。WaitOne
监视器的功能没有影响…@PeterRitchie-谢谢您的评论!在.NET4.0中,他们添加了一个新的。您应该使用它而不是
监视器。输入(obj)
FYI,等待句柄不是C#的一部分。他们是.NET的一部分。听说有人不知道编程语言和框架之间的区别,我总是感到震惊。尝试以下实验:删除所有“System.*”引用并构建。错误是框架的一部分。谢谢你的回答!谢谢。嗨,迈克。我做了编辑以备将来参考。如果你能批准,我将不胜感激。谢谢。@Sandman我不完全熟悉
Pulse
/
Wait
的正确用法,但我确实做了一个更正。另外,
lock
关键字可以通过try/finally完成
Enter
/
Exit
的工作。感谢您的修复。我真傻,没早点看到那件事。