问题标签 [manualresetevent]

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 投票
0 回答
718 浏览

.net - BackgroundWorker 和 ManualResetEvent

任务。

我有一种方法可以在内部运行两个长期功能。

我不是在这里谈论锁定对象。这些函数是独立的,只有在只读中使用的相同参数。

我想要一个函数在线程内运行。

问题。

<another code, dont bother>我这样做后立即运行Set()。没关系。

bw_RunWorkerCompleted在那之后运行。这意味着结果变量为空,但我希望它包含线程函数的结果。

如何返工我的代码 -result= (Result)e.Result必须在下一行之前运行WaitOne()

如果它不可能,BackgroundWorker也许我需要使用线程?我正在使用.NET 2.0。

0 投票
2 回答
18551 浏览

c# - 如果在 Set() 之后立即调用 Reset(),ManualResetEvent.WaitOne() 不会返回

我在生产服务中遇到问题,其中包含一个“看门狗”计时器,用于检查主处理作业是否已冻结(这与 COM 互操作问题有关,遗憾的是无法在测试中重现)。

以下是它目前的工作方式:

  • 在处理期间,主线程重置 a ManualResetEvent,处理单个项目(这不应该花费很长时间),然后设置事件。然后它继续处理任何剩余的项目。
  • 每 5 分钟,看门狗就会调用WaitOne(TimeSpan.FromMinutes(5))此事件。如果结果为假,则重新启动服务。
  • 有时,在正常操作期间,该看门狗会重新启动服务,即使处理时间不到 5 分钟。

原因似乎是当多个项目等待处理时,处理Set()第一个项目之后和处理Reset()第二个项目之前之间的时间太短,并且WaitOne()似乎没有识别出事件已设置。

我的理解WaitOne()是,被阻塞的线程保证在被调用时会收到信号Set(),但我认为我错过了一些重要的东西。

请注意,如果我允许在调用Thread.Sleep(0)后调用上下文切换Set(),则WaitOne()永远不会失败。

下面包含一个示例,它产生与我的生产代码相同的行为。WaitOne()有时等待 5 秒并失败,即使Set()每 800 毫秒调用一次

上述代码的输出


问题

虽然我知道Set()紧随其后的调用Reset()并不能保证所有阻塞的线程都会恢复,但是否也不能保证任何等待的线程都会被释放?

0 投票
3 回答
21251 浏览

c# - 关于使用ManualResetEvent使用c#?

我不熟悉 ManualResetEvent 的用法?

是否与线程有关。它做什么以及何时使用?

在这里,我得到了一个使用 ManualResetEvent 的代码,但我只是不明白它的作用?

这是代码

是什么意思_complete.WaitOne(); & _complete.Set(); ?

谁能给我一些ManualResetEvent类使用的小示例代码。

正在寻找 ManualResetEvent 的良好讨论和用法?谢谢

0 投票
1 回答
5527 浏览

c# - 如何使用 BackgroundWorker c# 实现暂停和恢复功能

我想用 BackgroundWorker 实现暂停恢复和取消功能。我有一个用户控件,并且所有与后台工作人员相关的代码都写在用户控件中。我只是在流布局控件上添加用户控件,就像用户单击按钮一样多。我无法 使用ManualResetEvent实现暂停和恢复功能,但无论如何我无法做到。所以在这里我粘贴我的用户控件类相关代码和我的表单代码。

在这里,我附上了 mu UI 的图片。 在此处输入图像描述

0 投票
1 回答
109 浏览

winapi - 为什么这种同步不起作用?

我有这个代码:

我希望交替调用这两个函数 (GenerateNumbers和)。DisplayNumbers但是,在启动时,GenerateNumbers它会被调用两次,然后它只是等待。该DisplayNumbers方法永远不会被调用。有人可以解释造成这种僵局的原因吗?

0 投票
0 回答
285 浏览

windows-phone-7 - Windows Phone 7 中的同步呼叫

我知道我无法在 Windows Phone 7 中进行真正的同步调用。但是,我试图至少阻止线程处理,直到进行异步调用或超时。我尝试了以下方法,但似乎我的应用程序只是忽略了它,放弃了呼叫,并且没有返回。任何想法为什么?

我正在尝试在绑定期间使用值转换器更新值。

0 投票
1 回答
295 浏览

windows-phone-8 - 在 Windows Phone 8 的后台线程中阻塞

我正在使用 Windows Phone 的 Coding4Fun 工具包的 MessagePrompt 对象。我想显示 MessagePrompt,然后阻止或等待 MessagePrompt 的 Completed 事件触发。我显然想在后台线程中执行此操作,因为我不想阻塞主 UI 线程。我已经玩了一段时间了,我已经将 ManualResetEvent 与 BackgroundWorker 连接起来,但它似乎并没有等待。实现这样的事情的最佳方法是什么?

提前致谢。

0 投票
2 回答
1750 浏览

asynchronous - 使用 SignalR 同步调用客户端方法

SignalR 无法拥有返回值的客户端方法。所以我正在尝试创建一个帮助类来实现这一点。

所以这就是我想要做的:

  1. 服务器端:调用客户端方法并提供唯一的请求idClient(clientId).GetValue(requestId)
  2. 服务器端:保存 requestId 并等待回答使用ManualResetEvent
  3. 客户端:内部void GetValue(Guid requestId)调用服务器方法hubProxy.Invoke("GetValueFinished", requestId, 10)
  4. 服务器端:通过requestId找到等待方法=>设置返回值=>设置信号
  5. 服务器端:方法不再等待 vorManualResetEvent并返回检索到的值。

不幸的是,我能够让它工作。这是我的代码:

使用这个MethodHandler类我需要有两个方法服务器端:

客户端实现是这样的:

问题:
如果我打电话给服务器端GetValue("clientid")。不会调用客户端方法。如果我注释掉returnWaiter.Signal.WaitOne();,则调用客户端GetValue并调用服务器端GetValueResult。但是当然这次方法已经返回了。

我认为这与,ManualResetEvent但即使使用while(!returnWaiter.HasValue) Thread.Sleep(100);也无法解决此问题。

任何想法如何解决这个问题?

提前致谢!

0 投票
2 回答
492 浏览

.net - .NET - ManualResetEvent.Reset 线程阻塞

根据 MSDN,ManualResetEvent'Reset()方法的目的是 -

将事件的状态设置为无信号,导致线程阻塞。

它阻塞了哪些线程?调用线程或当前线程或任何其他线程?

提前致谢。

0 投票
3 回答
2607 浏览

c# - ManualResetEvent not working; Thread

I have a client which creates a thread.

That thread has a WaitOne() so while it is stuck there my client does not die. But when I want to shut down my client, I need to do a Set() on that manual reset event.

I declare the manual reset event in the main class:

This is my Connect function which creates the thread with the start function:

And I have a callback which does the Set():

So the way this works is... all modules are initialized and blocked on the WaitOne() When I shutdown a module, the callback does the Set() but the WaitOne() is not unlocked and the thread does not continue. What am I missing?