【发布时间】:2012-10-05 12:01:27
【问题描述】:
询问this question后,我想知道是否可以等待一个事件被触发,然后获取事件数据并返回其中的一部分。有点像这样:
private event MyEventHandler event;
public string ReadLine(){ return event.waitForValue().Message; }
...
event("My String");
...elsewhere...
var resp = ReadLine();
请确保您提供的任何解决方案都直接返回值,而不是从其他东西中获取。我在问上面的方法是否以某种方式可用。我知道 Auto/ManuelResetEvent,但我不知道它们会像我上面那样直接返回值。
更新:我使用MyEventHandler(包含Message 字段)声明了一个事件。我在另一个名为ReadLine 的线程中有一个方法,等待事件触发。当事件触发时,WaitForValue 方法(事件处理场景的一部分)返回事件参数,其中包含消息。然后,该消息由 ReadLine 返回给调用它的任何对象。
The accepted answer 到 that question 我问的是我做了什么,但感觉不太对劲。几乎感觉在 ManuelResetEvent 触发和程序检索数据并返回数据之间的数据可能会发生一些事情。
更新:Auto/ManualResetEvent 的主要问题是它太容易受到攻击。一个线程可以等待该事件,然后在将其更改为其他内容之前没有给其他任何人足够的时间来获取它。有没有办法使用锁或其他东西?也许使用 get 和 set 语句。
【问题讨论】:
-
while 循环怎么样:
while (someGlobalvar);cahngesomeGlobalvar在您分配给事件的函数中。 -
它是主动等待,这是一个非常糟糕的解决方案
-
除了这个问题早于那个问题:)
-
@Vahid,自从我提出这个问题以来,我已有 7 年的编程经验,我想说,如果你必须这样做,那么你可能做错了。最好指定一个回调。如果您正在使用不允许其他任何东西的旧系统,例如 COM,那么只需让代码等待 ManualResetEvent 并设置第二个以保护写入,直到所有线程都完成读取,我猜。
-
我还建议您查看reactivex.io。