问题标签 [event-wait-handle]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
402 浏览

c# - 是否可以限制 EventWaitHandle 的设置/重置?

我想要一个 EventWaitHandle 对象(例如 ManualResetEvent),它只能从一个地方设置/重置,但可以从多个地方等待(使用 WaitOne())。换句话说,我希望只有一个类可以设置/重置它,而所有其他类都可以调用 WaitOne() 。这有点像常规的“只读”属性:

仅适用于 ManualResetEvent 中的特定方法。但不是:

当然,这是行不通的,因为虽然只有所有者类可以实例化该属性,但任何其他外部对象都可以使用 MyEvent.Set/MyEvent.Reset() 来更改它。

这样的事情甚至可能吗?这样做的目的是防止应用程序中的任意对象操纵等待句柄状态,并确保这可以仅从一个地方完成。

0 投票
2 回答
249 浏览

c# - 如何暂停和恢复线程

我有一个典型的生产者/消费者问题并尝试同步 2 个线程。我想在 C# Compact Framework 中找到 Suspend() 和 Resume() 的替代方法。它们都不受 CF 支持:(。我找到了一些示例,这些示例基于 EventWaitHandle 并使用类似:

但问题是 AutoResetEvent 也不是 Compact Framework 的一部分。我想知道是否有另一种方法可以使用 EventWaitHandle 解决此类生产者/消费者问题。我知道 AutoResetEvent 是从 EventWaitHandle 派生的。你还知道 EventWaitHAndle 的哪些其他子类?

0 投票
1 回答
282 浏览

c# - 我可以将 while(true) 循环转换为 EventWaitHandle 吗?

我正在尝试通过Parallel.ForEach将处理后的数据添加到BlockingCollection.

问题是我希望TasktaskWriteMergedFile 至少每 800000 行消耗集合并将它们写入结果文件。

我想我无法在迭代中测试集合大小,因为它是并行的,所以我创建了Task.

EventWaitHandle在这种情况下,我可以将任务中的 while(true) 循环转换为吗?

0 投票
0 回答
78 浏览

c# - EventWaitHandle 信号原因

有什么方法可以确定EventWaitHandle是通过调用发出信号Set();还是超时?一个例子:

我能想到的唯一选择是保存一个bool变量,每次调用都会改变,WaitOne()Set()我想知道框架是否有更优雅的解决方案

0 投票
1 回答
2967 浏览

c# - 如何使用 EventWaitHandle 创建事件?

我正在编写一个侦听串行端口的程序。我已经有代码利用 VCP 驱动程序(虚拟 COM 端口)打开串行连接,然后在收到数据时添加事件处理程序。该代码大致如下所示:

这很好用。我很容易理解如何使用+=符号设置事件。但我正在尝试从使用 VCP 驱动程序切换到使用 FTDI 提供的D2XX 驱动程序。我有我需要编写的大部分等效代码,除了在发生“数据接收”事件时能够读取数据的显着例外。

D2XX 驱动程序包括一种在接收到数据时设置事件处理程序的方法,称为SetEventNotification. 下面是方法签名的样子:

第一个参数很简单(它们有一些预定义的 uint,您可以传入以确定事件何时触发),但我以前从未直接使用 EventWaitHandles,而且我发现文档很难掌握,所以我我无法开始。

在一天结束时......我想要一个事件监听器方法来执行读取任务,并且我可以使用+=操作符分配它,就像我在上面对 VCP 驱动程序所做的那样。

根据我正在阅读的内容,看来我必须创建一个新Thread的,基本上连续轮询 EventWaitHandle 的信号?或类似的东西?任何让我开始(或完成!)的示例或示例代码将不胜感激。

这是我到目前为止所拥有的:

0 投票
0 回答
285 浏览

c# - 在 IIS 中部署后,Web 应用程序 EventWaitHandle 无法正常工作

我有一个 Web 服务 (WS) 和一个控制台应用程序 (CA)。

WS 接受数据并插入数据库。CA 读取此数据并执行操作。同步工作如下。WS有代码:

其中 newDataServiceMessageSignal 在 global.asax 文件中声明

在 application_start 上,被赋予以下值:

在 CA 中,有一个始终为 true 的 while 循环和 EventWaitHandle 上的 WaitOne

我的问题是,此代码在 IIS Express 上运行(在 Visual Studio 中调试)时运行良好,但在我发布和部署应用程序然后运行它时失败。即使 WS 设置信号,CA 也会持续等待(我假设 WS 将信号设置为之前的语句是数据库提交并且它成功)。我无法弄清楚,为什么它会这样。

任何帮助表示赞赏,谢谢。

0 投票
1 回答
343 浏览

c# - EventWaitHandle 阻塞整个表单

我已经环顾了很长时间了,但没有任何解决方案..

我想要实现的是使用 EventWaitHandle 类来暂停一个线程。

所以,我在一个表单上创建了两个按钮。第一个应该发送一条消息,然后暂停,第二个应该取消暂停第一个按钮的线程,然后发送另一条消息。像那样:

但是一旦线程被阻塞wh.WaitOne(),我就不能在整个表单上做任何事情,包括按下第二个按钮或至少关闭它..

我做错了什么?因为我似乎找不到我能找到的示例和我的代码之间的任何区别。

0 投票
1 回答
1628 浏览

c# - 在 .Set 之后直接在 EventWaitHandle 上调用 .Close (.Dispose) 是否安全?

我有一个线程在 EventWaitHandle (AutoResetEvent) 上等待:

我有另一个线程指示第一个线程继续

在 .Set 之后直接调用 .Close 是否安全,换句话说,是否可以保证在 AutoResetEvent 被释放之前等待线程已经继续?

0 投票
0 回答
133 浏览

c# - 如何获取用于打开 EventWaitHandle 的名称?

我正在尝试实现一个跨进程事件架构,其中进程可以“订阅”事件,然后“取消订阅”。

我使用 EventWaitHandle 的初始测试很有希望(尽管我已经阅读了一些关于它们的负面评论,但请暂时搁置)。

由于这些东西是命名的,实际上是使用 OpenExisting 按名称打开的,我有点惊讶地发现 EventWaitHandle 类没有 Name 属性,因此给定它们的集合我可以找到给定名称的那个.

那么,给定这些东西的集合,有没有办法看到每个东西是用什么名字来创建的?

0 投票
1 回答
300 浏览

multithreading - 使用 MemoryCache 的数据存储库

我构建了一个自制数据实体存储库,其中包含一个按类型定义保留策略(例如绝对或滑动到期)的工厂。该策略还将缓存类型指定为 httpcontext 请求、会话或应用程序。MemoryCache 由所有 3 种缓存类型中的缓存代理维护。无论如何,我有一个与存储库相关的数据实体服务,它为我们的主要数据实体加载和保存。这个想法是您使用实体存储库,并且不需要关心实体是否被缓存或从它的数据源(在本例中为 db)检索。

一个明显的假设是您需要同步加载/保存事件,因为您需要在从数据源加载实体之前保存缓存的实体。

所以我今天正在调查生产中的数据完整性问题...... :)

今天我读到从 MemoryCache 中删除的实体和 CacheItemRemovedCallback 事件触发之间可能存在很长的差距(默认为 20 秒)。我对加载和保存数据操作的简单锁定是不够的。此外,CacheItemRemovedCallback 位于 HttpContext 之外的自己的上下文中,这让事情变得有趣。这意味着我需要将回调函数设为静态,因为我可能会将已处置的实例分配给事件。

因此,一旦我意识到可能存在差距,即我的数据实体不再存在于缓存中,但可能没有保存到它的数据源中,这可能会解释 5000 个中的 3 个损坏订单。在填写长表格时,它将是易于在主数据实体上执行超出策略 20 分钟滑动到期的工作。这意味着如果他们碰巧在到期的同一时刻提交了加载(通过请求上下文)和保存(通过缓存过期回调)之间的有趣竞争条件。

用一个简单的锁它就是掷骰子,保存或加载会赢吗?显然,我们需要在下一次从数据源 (db) 加载之前进行保存。理想情况下,当一个项目从缓存中过期时,它会自动写入它的数据源。当实体从缓存中消失但过期回调尚未触发时,加载操作可能会进入。在这种情况下,将无法在缓存中找到实体,因此默认从数据源加载。但是,由于保存操作可能尚未开始,从而导致数据完整性损坏,并且可能会破坏您现在保存的缓存数据。

为了完成同步,我需要一个命名的信号锁,所以我选择了 EventWaitHandle。每个用户创建一个 < 5000 的命名锁。这允许 Load 等待来自保存实体的过期事件的信号(其线程存在于 HttpContext 之外的自己的上下文中)。所以在保存中很容易抓住现有的名称句柄并在保存完成后向加载发出信号以继续。

我还有一个冗余,它超时并通过保存操作记录每 10 秒块。正如我所说,默认值意味着从 MemoryCache 中删除一个实体到它意识到它会触发该事件进而保存实体之间的 20 秒。

感谢所有跟随我的漫谈的人。鉴于同步要求的性质,EventWaitHandle 锁是最佳解决方案吗?