3
我有一个异步类StartProcessing()
方法,当它完成处理时引发一个int ResultReady()
事件。 StartProcessing()
只需要很少的时间。等待,直到一个代表被调用
我想同步调用这个类。我的伪代码应该是这样的:
呼叫StartProcessing()
等待/休眠状态,直到结果准备
返回结果
什么设计模式最适合这个?你能指点我一个代码示例吗?
我有一个异步类StartProcessing()
方法,当它完成处理时引发一个int ResultReady()
事件。 StartProcessing()
只需要很少的时间。等待,直到一个代表被调用
我想同步调用这个类。我的伪代码应该是这样的:
呼叫StartProcessing()
等待/休眠状态,直到结果准备
返回结果
什么设计模式最适合这个?你能指点我一个代码示例吗?
这样做的一个简单方法是使用事件处理程序和等待代码都可以访问的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 2015-10-02 07:35:12