类似的问题:包装纸异步计算到同步(阻塞)计算
- Pattern for wrapping an Asynchronous JavaScript function to make it synchronous
- Wrapping an asynchronous method synchronously in C#
我有一个方法的对象我想暴露到库客户机(尤其是脚本客户端)如下所示:
interface MyNiceInterface
{
public Baz doSomethingAndBlock(Foo fooArg, Bar barArg);
public Future<Baz> doSomething(Foo fooArg, Bar barArg);
// doSomethingAndBlock is the straightforward way;
// doSomething has more control but deals with
// a Future and that might be too much hassle for
// scripting clients
}
但原始的“东西”我可以是一组事件驱动类:
interface BazComputationSink
{
public void onBazResult(Baz result);
}
class ImplementingThing
{
public void doSomethingAsync(Foo fooArg, Bar barArg, BazComputationSink sink);
}
其中ImplementingThing需要投入,做一些神秘的东西,就像一个任务队列进行排队的东西,再后来当结果出现,sink.onBazResult()
被调用的线程可能与调用ImplementingThing.doSomethingAsync()的线程相同或不同。
有没有一种方法可以使用事件驱动的函数以及并发基元来实现MyNiceInterface,以便脚本客户端可以愉快地等待阻塞线程?
编辑:我可以使用FutureTask吗?
(+1)很好的解决方案 – skaffman 2010-02-01 22:27:34
+1,因为我认为我理解它......但是您能解释并发性方面吗? (使用倒计时锁存器) – 2010-02-01 22:58:10
你也在onBazResult()中的某个地方缺少“done = true”...... – 2010-02-01 23:01:15