模拟C#中的等待句柄? -- c# 领域 和 .net 领域 和 multithreading 领域 和 .net-4.0 领域 和 autoresetevent 领域 相关 的问题

Simulating Wait handles in c#?


0
vote

问题

中文

我们可以使用 Wait Pulse 来模拟 ManualResetEvent ,如下所示:

代码#1

  readonly object _locker = new object(); bool _signal; void WaitOne() {   lock (_locker)    {      while (!_signal) Monitor.Wait (_locker);    } }  void Set() {     lock (_locker)        { _signal = true;          Monitor.PulseAll (_locker);        } }  void Reset()     {     lock (_locker) _signal = false;     }   

罚款

现在让我们谈谈增强它是 AutoREsetEvent

AutoResetEvent 只是一个替换 WaitOne 中的代码的问题:

代码#2

  lock (_locker) {     while (!_signal) Monitor.Wait (_locker);     _signal = false;//<--------------- }   

并替换 PulseAll 使用 Pulse Pulse0 方法中:

代码#3

  Pulse1  

在这里是问题: 在代码#2,行<代码> Pulse2 。

为什么需要? Pulse3 只达到 1 等待句柄,我知道 Pulse4 允许只能通过一个被封锁的物品通过并自动关闭门。

所以为什么写入 Pulse5 是必要的? 。

英文原文

We can use Wait and Pulse to simulate a ManualResetEvent as follows:

code #1

readonly object _locker = new object(); bool _signal; void WaitOne() {   lock (_locker)    {      while (!_signal) Monitor.Wait (_locker);    } }  void Set() {     lock (_locker)        { _signal = true;          Monitor.PulseAll (_locker);        } }  void Reset()     {     lock (_locker) _signal = false;     } 

fine

now lets talk about enhancing it to be AutoREsetEvent :

an AutoResetEvent is simply a matter of replacing the code in WaitOne with this:

code #2

lock (_locker) {     while (!_signal) Monitor.Wait (_locker);     _signal = false;//<--------------- } 

and replacing PulseAll with Pulse in the Set method:

code #3

lock (_locker)     { _signal = true;       Monitor.Pulse (_locker);     } 

and here is the question : at code #2 , the line _signal = false;.

why is it necessary ? Pulse will only reach 1 wait handle and I know that AutoREsetEvent is letting only one blocked item to go through and automatically close the gate.

so why writing _signal = false is necessary ? .

              
         
         

回答列表

3
 
vote
vote
最佳答案
 

如果 42.68029,23.3297840 变量停留 42.68029,23.3297841 ,那么如果另一个线程调用 998877613 呼叫,它不会等。您不必考虑如何处理现有的等待线程 - 您必须考虑对象的整体状态。

 

If the _signal variable stays true, then if another thread calls WaitOne after the Set call, it wouldn't wait. You don't just have to consider how existing waiting threads are handled - you have to consider the overall state of the object.

 
 
         
         

相关问题

0  我的代码会被击中吗?并发dictionary trygetvalue(..)  ( Will my code ever be hit concurrentdictionary trygetvalue ) 
如果我有一个并发词典,我尝试一个trandgetValue,我测试了它是否失败了我做的东西,但如果它没有失败,并且从trategetValuefunction检索的输出值等于我之前是什么尝试了TrictgetValue,我做了别的东西。 我的问题是,(假设我的并发inicational中的任何内容都将被设置为默认(...

14  格式化跟踪输出  ( Formatting trace output ) 
我正在使用 TextWriterTraceListener 将诊断消息记录到文本文件。但是,我也没有记录添加的每个跟踪消息的时间戳。是否有可能为侦听器定义一种类型的格式化器,它会自动添加时间戳? 目前我在每一个 a = [1, 2, 3], b = [4, 5, 6], c = [1, 7, 8], 0 呼叫中手动添...

0  删除功能c#  ( Put break in function c sharp ) 
我有一个切换语句: swtich(x) { case 1: ... break; case 2: ... break; } 我想把 ... 代码放在一个函数中,但我也想打破......所以我想要一些类似的...

4  如何在ASP.NET MVC应用程序中实现搜索框?  ( How do i implement a search box in an asp net mvc application ) 
我需要在C#MVC应用程序上实现一个"搜索" 框,即我写的。 我以前从未实施过"搜索" 框,我一直在寻找一些最佳实践,我并不是那么找到我正在寻找的东西。 我真的很喜欢搜索如何在stackoverflow上工作。 如果我键入几个随机单词,它会导航到URL http:// stackoverflow /搜索?q =...

-1  “sqlcmd.exe -s实例使用......”在命令行中工作,但我无法将其移动到c#进程  ( Sqlcmd exe s instance use work in command line but i cant move it to c ) 
我正在尝试将此命令移动到C#进程: SQLCMD.EXE -S InstanceName USE [master] GO CREATE DATABASE [Ek] ON ( FILENAME = N'C:Program FilesMicrosoft SQL ServerMSSQL15.MSSQLSERVERMS...

0  具有最大电子邮件客户端兼容性的Windows上创建和显示电子邮件  ( Creating and showing e mail on windows with maximal e mail client compatibility ) 
我需要创建可以从命令行调用的可执行文件,该命令行将创建一封电子邮件,将文件附加到电子邮件并向用户显示电子邮件,以便他们可以完成电子邮件并发送它。这应该在用户配置为默认的电子邮件客户端中完成。 这需要尽可能多地为许多电子邮件客户工作。我意识到的那些是最多的都是Outlook 2007-2010,Outlook Expr...

47  了解属性是否已被声明为虚拟  ( Find out if a property is declared virtual ) 
抱歉,我正在查找 998876622 类型和 RuntimeError3 类型在文档中,但我似乎无法找到我需要的东西。 如何判断属性(或方法或任何其他成员)在其声明类中声明 RuntimeError4 ? 为例如。 RuntimeError5 如何判断 998876626 属性是否已声明 RuntimeErr...

2  查询在phpmyadmin中工作不起作用  ( Query is working in phpmyadmin does not work in c sharp ) 
我有这个查询,给了我在phpmydmin中使用它,但在c#中它给出了这个图片 [(('a', 1), ('b', 3), ('b', 3)), (('a', 1), ('b', 3), ('c', 10)), (('d', 15))] 1 是什么原因? 使用c#2008 mysql 5.0 ...

7  当呼叫时,异步呼叫之间的无功延伸固定间隔比间隔长度长  ( Reactive extension fixed interval between async calls when call is longer than i ) 
这是我的 Interval 定义: m_interval = Observable.Interval(TimeSpan.FromSeconds(5), m_schedulerProvider.EventLoop) .ObserveOn(m_schedulerProvider.Eve...

0  将字节数组转换为C#中JPEG类型的图像  ( Convert bytes array to image of type jpeg in c sharp ) 
我可以将任何字节数组(byte [])转换为c#中的jpeg图像吗? 例如,如果我转换或 word 或 9988766610 文件到字节数组中,那么可以将此数组转换为C#中的JPEG图像? ...

1  C#如何在基类中使用Eventarg  ( C sharp how to consume an eventargs in a base class ) 
我正在使用WinForms在C#中创建应用程序。 我想要的: 我想要一个箭头上的按钮。当按下箭头按钮的一部分时,它将显示下降,但如果按下按钮的任何其他部分,则应触发鼠标单击事件。 我需要什么帮助: 我有信心我可以通过使用鼠标位置来完成鼠标位置检查,但是如何确保按钮的实例的事件处理程序只有"鼠标按钮向下" 事件...

4  未处理的异常:system.reflection.reflectiontypeloadexception在Unity3d中  ( Unhandled exception system reflection reflectiontypeloadexception in unity3d ) 
我收到这个错误:运行时编译时间错误我搜索了Unity Forum,他们正在为System.Web.dll文件问题表示,我已经清除了,也会再次受到资产,但它仍然没有工作。< / p> Jenkins5 我从Unity获得的答案是: http://answers.unity3d.com/questions/...

1  如何将列表转换为DataTable  ( How to convert a list to datatable ) 
我有一个来自 JSON 文本的类 这是我的代码 SearchResult myojb = (SearchResult)js.Deserialize(objText, typeof(SearchResult)); 和 SearchResult 类是 public class SearchResul...

5  调用通用扩展方法而不指定多种类型  ( Calling a generic extension method without specifying as many types ) 
以下是我用于测试类型扩展方法的类的片段: def test_SetOwner(self, owner): self.objectid.SetOwner(owner) self.assertEqual(self.objectid.GetOwner(), owner) 8 我有以下扩展方法: de...

4  如何强制调试器跳过一段代码?  ( How to force debugger to skip a piece of code ) 
我的项目中有大量的代码已经调试了50%。 每次我尝试调试它时,我都必须在不需要的代码后手动设置断点以跳过它。 有没有办法告诉调试器不调试该一部分代码? 任何延伸? 让我们的面部调试器在线1500。 Method1(){ Line 1500 CODE Line 1501 CODE ... L...




© 2021 it.wenda123.org All Rights Reserved. 问答之家 版权所有


Licensed under cc by-sa 3.0 with attribution required.