preguntas similares:Envolver un cálculo asíncrono en un cálculo síncrona (bloqueo)
- Pattern for wrapping an Asynchronous JavaScript function to make it synchronous
- Wrapping an asynchronous method synchronously in C#
Tengo un objeto con un método me gustaría exponer a los clientes de la biblioteca (especialmente clientes de scripting) como algo como:
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
}
pero la "materia" primitivo que tengo disponible es un conjunto de clases basadas en eventos:
interface BazComputationSink
{
public void onBazResult(Baz result);
}
class ImplementingThing
{
public void doSomethingAsync(Foo fooArg, Bar barArg, BazComputationSink sink);
}
donde ImplementingThing toma insumos, hace algunas cosas arcano, como encolar las cosas en una cola de tareas, y luego más tarde cuando se produce un resultado , Se llama a sink.onBazResult()
en un hilo que puede ser o no el mismo hilo que ImplementingThing.doSomethingAsync().
¿Hay alguna manera de usar las funciones controladas por eventos que tengo, junto con las primitivas de concurrencia, para implementar MyNiceInterface para que los clientes de scripting puedan esperar con gusto un hilo de bloqueo?
editar: ¿Puedo usar FutureTask para esto?
(+1) buena solución – skaffman
+1 porque creo que lo entiendo ... pero ¿podría explicar los aspectos de concurrencia? (el uso del bloqueo de cuenta regresiva) –
también te falta un "hecho = verdadero" en algún lugar en onBazResult() .... –