问题标签 [autoresetevent]

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 回答
659 浏览

c# - 无法在 STAThread 中使用 AutoResetEvent.WaitOne() 和 Thread.Sleep

在我的程序中,主函数启动一个后台线程,该线程在 UI 线程中创建我需要的对象(使用 Windows 窗体,因此标记为 [STAThread])。

简化代码:

但是,即使我在 lock 语句处设置了断点,它也会res变为 false 并且该字段在主线程中保持为空。kernel此外,Thread.SleepMain函数中使用将立即返回,而无需休眠。

所以在我看来,这可能[STAThread]会对这些方法施加限制?!这是真的吗,有什么好的方法可以规避这个问题?就我而言,我可能会将主线程标记为非 STA,然后稍后运行 STA 线程(还没有尝试过),但是有没有通用的解决方案?

0 投票
2 回答
858 浏览

c# - waitany(Array) 是否真的“设置”了一个事件,或者它只是返回一个信号事件的索引

http://msdn.microsoft.com/en-us/library/tdykks7z.aspx

根据文档,返回值为:

“满足等待的对象的数组索引。”

所以这意味着索引表示已设置的事件,并且此代码将导致死锁,因为它会等待自己:

这段代码是正确的:

我只是想确保(以我的拙见)文档不是 100% 清楚的

编辑:

我的设计有缺陷,正如@Hans Passant 指出的那样,我应该使用信号量。因为我想确保 N 个 yahooRequests 可以访问一个函数。但@arno 从技术上回答了最初的问题。真希望我能设置两个接受的答案

编辑:

同样正如@Sriram Sakthivel 在评论中指出的那样,第一个示例将永远等待自己。但实际上并不是死锁。

0 投票
1 回答
57 浏览

c# - 多线程中的信号问题

我正在从Albahari 的线程文章链接中实现“生产者/消费者队列” -->

在下面这篇文章的工作方法中,如果我在_wh.WaitOne() 之前添加一个控制台写入,如 Console.WriteLine("In waiting state .... 1"),那么信号不起作用并且消费者线程似乎无限期地等待.

有人可以解释这种行为吗?

0 投票
1 回答
634 浏览

c# - 使用等待句柄

我正在尝试做这样的事情:

在代码的其他地方,会有调用的方法:

所以 LongRunningOperation() 被执行..

问题是,handler.Set()可以在AsyncWait()线程运行时再次调用LongRunningOperation()

这使得当仍在执行LongRunningOperation()时被调用时将永远不会被调用handler.Set()AsyncWait()LongRunningOperation()

如何做到这一点?:(

0 投票
0 回答
152 浏览

c# - AutoResetEvent 自行触发

我有一个奇怪的 AutoResetEvent 行为

Utils 类中有代码:

并且在收听时有代码:

它是这样调用的:

在这种情况下,第一次调用 WaitOne 时,它​​会立即返回 false(就像超时一样)。第二次没问题,调试输出中甚至没有“DownloadStringAsinc 完成”。当我从主线程调用 Utils.FileDownloaded.WaitOne(2222) 时(我知道这是不对的,只是在测试)它按预期工作。但是当我将块移动到线程时,出现了这种行为。另外,如果我在稍后块中的“if”语句之前创建 Thread.Sleep(200),一切正常

必须添加:来自 Utils 类的代码不会从不同的地方同时调用。

我可能会考虑:“好的,此应用程序的问题已解决”。但这并没有解决我的问题。我必须明白。

0 投票
2 回答
2449 浏览

windows - setEvent 在没有 ResetEvent 的情况下被调用

如果使用 setEvent 设置了手动重置事件但未使用 ResetEvent 重置,会发生什么情况;并且该事件被多次触发。即在处理事件时,再次设置事件。

以下是示例任务:

现在,假设当 hEvent1 的情况正在执行时(即它仍然设置),不知何故再次触发了 hEvent1。我故意不放 ResetEvent(hEvent1) 即使它是手动复位事件。那么,我们有竞争条件吗?

0 投票
4 回答
430 浏览

c# - 两线程一核

我正在玩一个简单的控制台应用程序,它创建一个线程,并在主线程和工作线程之间进行一些线程间通信。

我正在将对象从主线程发布到并发队列,并且工作线程正在将其出列并进行一些处理。

让我感到奇怪的是,当我分析这个应用程序时,即使我有两个内核。一个核心是 100% 空闲的,而另一个核心已经完成了所有工作,我看到两个线程都在该核心中运行。 在此处输入图像描述

为什么是这样?

是因为我使用了一个等待句柄,它在我发布消息时设置并在处理完成时释放?

这是我的示例代码,现在使用 2 个工作线程。它的行为仍然相同,main、worker1 和 worker2 在同一个内核中运行。想法?

[编辑] 它现在有点用,至少,与昨天相比,我的性能提高了两倍。诀窍是减慢消费者的速度,以避免使用 AutoResetEvent 发出信号。

0 投票
0 回答
561 浏览

.net - 从 AutoResetEvent.WaitOne(timeout) 调用唤醒的线程延迟

我需要调用 3rd 方库,但我不能总是等待结果。我决定在后台线程上进行调用,然后在有限的时间内等待调用完成(最好等待,但我不能永远等待)。我的方法如下。我传入一个调用 3rd 方方法的委托

问题是调用线程似乎并没有很快从 WaitOne() 调用中唤醒。如果我传入 3000 的超时值,我希望 Waitone() 调用阻塞不超过 3 秒。但是,在调用 .Set() 和 WaitOne() 方法返回之间似乎有很长的延迟。

我检查 WaitOne() 的返回状态,它返回 true 表示已收到信号(未超时)

我意识到您无法控制线程计划运行的时间,但这发生在应用程序关闭并且没有其他任何事情发生时。此外,等待 23 秒以安排线程运行似乎过分了。

在 i5 四核 3GHz 64 位、.Net 4.0、Windows 7 Ultimate 上运行

我错过了什么?

0 投票
0 回答
88 浏览

windows-phone-8 - 分配在另一个线程上运行的事件处理程序

我正在尝试将 windows phone 8 图像捕获代码放入我基本上拥有的旧模型中

...

...

有没有办法让事件处理程序在另一个线程上运行完成的事件,以便 AutoResetEvent 在调用时不会阻止它运行?

0 投票
1 回答
392 浏览

c# - c#中信号线程的性能

我一直试图了解“唤醒”一个正在等待阻塞构造的线程需要多长时间AutoResetEvent- 从我阅读多次讨论后的理解来看,Windows 有某种内部时钟,每 15.6 毫秒“滴答”一次(或左右),然后决定接下来安排哪些线程运行,所以我希望发出一个线程直到该线程唤醒之间的时间差将花费 0-15.6ms 之间的随机时间。所以我写了这个小程序来测试我的理论:

令我惊讶的是,平均唤醒时间约为 0.05 毫秒 - 所以显然我错过了一些东西,但我不知道是什么......