Quiero hacer algo como lo siguiente: básicamente estoy llamando a una operación asíncrona que llamará a una devolución de llamada en otro hilo y quiero esperar a que se complete "en línea". Mi preocupación es que eso cambia las variables compartidas a través de subprocesos (barra & evento) puede no sincronizarse debido a que se almacena en los registros, por ejemplo. Si fueran variables miembro, podría marcarlos como volátiles pero volátiles no se pueden usar en variables locales creadas en la pila. Podría usar las variables miembro, pero creo que es más limpio y no desordena mi clase manteniéndolo todo local.¿Es seguro compartir la variable local entre subprocesos (a través de un cierre de devolución de llamada)?
Bar bar = null;
ManualResetEvent event = new ManualResetEvent(false);
foo.AsyncOperation(new Action(()=>{
// This delegate will be called in another thread
bar = ...
event.Set();
}));
event.WaitOne(timeout);
// use bar
Nota: a menos que haga algo más entre '' AsyncOperation' y WaitOne', que también podría ejecutarlo de forma sincrónica –
Esta pregunta se relaciona: http://stackoverflow.com/questions/6581848/memory-barrier- generators/6932271 # 6932271 –
@Marc - Buen punto, pero el API que estoy llamando inherentemente asíncrono. Se basa en mensajes enviados a través de la red a un servidor. Dentro de AsyncOperaton, se establece un mensaje y se notifica la devolución de llamada cuando hay una respuesta. Lo uso de forma asíncrona la mayor parte del tiempo, pero en este caso particular quiero esperar al resultado. Incluyo un tiempo de espera en WaitOne en caso de que la respuesta no llegue. – Shane