【问题标题】:Wait until a delegate is called等到一个委托被调用
【发布时间】:2011-02-14 07:05:40
【问题描述】:

我有一个带有StartProcessing() 方法的异步类,当它完成处理时会引发int ResultReady() 事件。 StartProcessing() 花费很少的时间。

我想同步调用这个类。我的伪代码应该是这样的:

  1. 调用 StartProcessing()

  2. 等待/睡眠,直到结果准备好

  3. 返回结果

什么设计模式最适合这个?你能指点我的代码示例吗?

【问题讨论】:

    标签: c# asynchronous task begininvoke


    【解决方案1】:

    一种简单的方法是使用ManualResetEvent,事件处理程序和等待代码都可以访问它。从事件处理程序调用Set,从等待线程调用WaitOne(或超时重载)。请注意,这不能在 STA 线程上完成,因此您不能在 WinForms 线程(应该始终是 STA)内完成 - 但无论如何您都不应该在 UI 线程中等待。

    类似这样的:

    var async = new AsyncClass();
    var manualEvent = new ManualResetEvent();
    async.ResultReady += args => manualEvent.Set();
    async.StartProcessing();
    manualEvent.WaitOne();
    

    【讨论】:

    • 当我这样做时,似乎永远不会调用 ResultReady。我怀疑委托被设置为在同一个被阻塞的线程中启动。但是,在我的情况下,委托是从我无法控制的框架中调用的。因此,我永远无法通过 WaitOne。你对如何解决它有什么想法吗?
    • @dynamokaj:代表在任何特定线程中都没有“开始”。您使用的框架可能会决定在特定线程中引发事件......但基本上我们无法在没有更多信息的情况下为您提供帮助。我建议你问一个更详细的新问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-29
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 2010-11-18
    • 1970-01-01
    相关资源
    最近更新 更多