问题标签 [waitone]

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 投票
2 回答
3131 浏览

c# - 超时结束后触发事件

我必须等待触发事件。我最初的解决方案是使用AutoResetEventand WaitOne(),但事件总是在等待超时结束后触发。所以我回到了下面的方法,但我仍然有同样的问题。超时结束后 2 或 3 秒,无论超时是什么,都会触发事件。

这是事件处理程序代码:

事件本身由调用上述函数的另一个函数触发。基本上它看起来像这样:

有谁知道导致这个问题的原因以及我该如何解决?

编辑:不再相关。转发了 OnResponseArrived 事件,因为我没有及时找到其他解决方案。

0 投票
3 回答
17858 浏览

c# - 如何解除对 AutoResetEvent 对象调用 WaitOne 方法的线程的阻塞?

下面是一个具有“SomeMethod”方法的类,它说明了我的问题。

该方法被设计为线程安全的,将在不同的线程中调用。现在我的问题是,如何在任何时候解除对“theEvent”对象调用“WaitOne”方法的所有线程的阻塞?这个要求经常出现在我的设计中,因为我需要能够优雅地停止和启动我的多线程程序。在我看来,启动一个多线程程序相当简单,但要停止一个程序却很棘手。

这是我迄今为止尝试过的显然有效的方法。但这是标准方法吗?

“UnblockAll”方法是“SomeClass”类的成员。此处使用的技术基于WaitOne 方法的 MSDN 文档。我引用了以下文档的相关部分:

如果毫秒超时为零,则该方法不会阻塞。它测试等待句柄的状态并立即返回。

在 do..while 循环中,我调用Set 方法。这会释放一个可能由于调用 WaitOne 方法而阻塞的线程(编码在“SomeMethod”方法中)。接下来我测试“theEvent”对象的状态,以了解它是否已发出信号。该测试是通过调用带有超时参数的 WaitOne 方法的重载版本来完成的。我在调用 WaitOne 方法时使用的参数为零,根据文档,这会导致调用立即返回一个布尔值。如果返回值为真,则“theEvent”对象处于信号状态。如果在“SomeMethod”方法中调用“WaitOne”方法时至少有一个线程被阻塞,则对“Set”方法的调用(编码在“UnblockAll”方法中)将解除阻塞。因此,在“UnblockAll”方法中的 do..while 语句末尾调用“WaitOne”方法将返回 false。仅当没有线程阻塞时,返回值才为真。

上述推理是否正确,如果正确,该技术是否是处理我的问题的标准方法?我正在尝试主要在 .net compact-framework 2.0 平台上使用该解决方案。

0 投票
3 回答
1009 浏览

windows-phone-7 - 如何等待响应并对其进行操作?

我有一个新问题。我想对响应做一些操作,但我得到一个 NullReferenceException,因为它还没有到达......这是我的代码:

但是当我使用 ManualResetEvent 类时,我的应用程序只是挂起,因为 if(dataReady.WaitOne()) 行。以下是 ManualResetEvent 类的完整代码:

所以,我的问题是:如何等待响应并对其进行操作? (我尝试使用 Application.DoEvent 方法,但它在 WP7 中不存在......)

0 投票
1 回答
282 浏览

c# - Webservice:AsyncCall 已完成:但 WaitOne() 仍在等待

  1. 我正在通过命令行 Exe 调用 WebService 方法。
  2. 此方法调用是异步调用,我在调用后使用 WaitOne。
  3. 我正在完成的方法中执行 ManualRest.Set()。

在异步方法在 10-20 分钟内返回的情况下,上述设置在 99% 的情况下都能正常工作,

当异步调用需要更多时间(例如 2-3 小时)然后未执行 WaitOne() 之后的代码时,就会出现问题。

我在 waitone() 之前和之后以及 Completed 事件中都写了日志,但是在 3 小时的异步调用之后,控件似乎没有恢复。

上面的任何帮助/指针...

谢谢。

0 投票
1 回答
772 浏览

asynchronous - 在 ServiceBus 上使用 BeginReceive 和 EndReceive 发送消息对我不起作用

我需要在总线上进行异步消息传递。

这是我正在使用的代码:

这是异步获取:

我得到的输出是:

它说那行 result.AsyncWaitHandle.WaitOne(); 正如我认为的那样,直到 AsyncGet 的线程完成后才停止执行。请告诉我我在这里做错了什么。谢谢!

0 投票
2 回答
174 浏览

windows-phone-7 - WP7 和 Skydrive WaitOne 阻止一切

我正在尝试从 SkyDrive 下载文件并将异步调用包装在同步类中。然而,当我打电话给 WaitOne 时,一切都被阻止了,EventHandeler 永远不会被调用。

0 投票
1 回答
803 浏览

c# - 子线程完成后主线程不继续

我正在尝试在我的应用程序中使用多线程。该方法test5尝试从 Internet 获取一些内容,而main线程在继续其他工作之前等待所有线程完成。

但是我的main线程在调用后没有回来test5,我的控制台线Done Inside!!thread all got back!!永远不会到达。

我该如何解决这个问题?

0 投票
2 回答
1445 浏览

c# - 即使所有事件都已触发,WaitOne() 也会永远等待

Threaded 应该创建 4 个单独的线程并等待它们中的每一个直到它们完成。每个线程都会休眠一段时间,并且仅当共享的 Mutex opbject 未被另一个线程占用时才终止,然后通过一个事件发出信号表明它已完成(这是我的代码的简化版本,但在同一位置失败)

但是发生的情况是,大多数时候主线程将永远等待 WaitOne() 看似随机的一个。

此外,我不得不注释掉我的代码的某些部分,因为它会导致更多意想不到的行为(即,在每个线程完成后,主线程会以某种方式跳回 for 子句并导致 IndexOutOfBounds)

任何帮助都会很棒

0 投票
2 回答
3466 浏览

c# - 如何使用 WaitHandle 等待异步调用完成?

考虑这段代码:

我们有结果:

所以,我想要结果:

我怎么能async在这段代码中等待?我查看了 MSDN 文章“异步调用同步方法”,发现:

调用后,BeginInvoke您可以执行以下操作:

  • 做一些工作,然后调用EndInvoke阻塞直到调用完成。
  • WaitHandle使用该IAsyncResultAsyncWaitHandle
    属性获取 a ,使用其WaitOne方法阻止执行,直到
    WaitHandle发出信号,然后调用EndInvoke.
  • 轮询 IAsyncResult返回的 byBeginInvoke以确定异步调用何时完成,然后调用EndInvoke.
  • 将回调方法的委托传递给BeginInvoke. 当异步调用完成时,该方法在ThreadPool线程上执行。回调方法调用EndInvoke.

我认为这一秒对我来说更好。但是如何实现呢?特别是我对重载感兴趣WaitOne()阻塞当前线程,直到当前 WaitHandle 收到信号)。如何正确地做到这一点?我的意思是这种情况下的常见模式。

更新:

现在我使用Task<T>

SomeMethod()这是空的主要问题list

结果: 在此处输入图像描述

现在我有可怕的解决方案:(

结果:

在此处输入图像描述

这就是我需要等待异步调用的原因。我如何WaitTask这里使用?

更新 2:

0 投票
2 回答
3225 浏览

c# - 如何最好地处理因 AutoResetEvent.WaitOne() 而处于休眠状态的线程

我有一个 Windows 服务,它以 5 个线程之一发送电子邮件(这样做是为了提高服务发送电子邮件的速度):

我有一种Queue方法可以将一条或多条新消息添加到 messageQueue 并调用block.Set(),以便 5 个线程之一可以发送消息。当允许其中一个线程运行时,只要队列中有消息,block.Set()就会调用,以便下一条消息可以出队,并且 5 个线程中的另一个将工作发送它。以此类推,直到队列为空。这一切正常。

但是,当我处理我的对象时,我设置了处理变量,然后为每个线程:

大多数情况下,线程由于 s 而处于休眠状态block.WaitOne,因此上面的代码中止了线程。但是,这会导致记录线程中止异常。我可以将线程中止异常与其他异常分开捕获并选择不记录,但这似乎不是很干净。

在不导致过多日志记录的情况下清理这些线程的最佳方法是什么?

更新:

我已将以上内容更改为:

谢谢您的帮助。