Después de preguntar this question, me pregunto si es posible esperar a que se dispare un evento, y luego obtener los datos del evento y devolver parte del mismo. Más o menos así:Cómo bloquear hasta que se active un evento en C#
private event MyEventHandler event;
public string ReadLine(){ return event.waitForValue().Message; }
...
event("My String");
...elsewhere...
var resp = ReadLine();
Asegúrese de que la solución que proporcione devuelva el valor directamente en lugar de obtenerlo de otra cosa. Pregunto si el método anterior está disponible de alguna manera. Sé de Auto/ManuelResetEvent, pero no sé si devuelven el valor directamente como lo hice anteriormente.
Actualización: He declarado un evento usando MyEventHandler
(que contiene un campo Message
). Tengo un método en otro hilo llamado ReadLine
esperando a que el evento se dispare. Cuando el evento activa el método WaitForValue (parte de la escena de manejo de eventos) devuelve los eventos args, que contienen el mensaje. A continuación, ReadLine devuelve el mensaje a lo que lo llamó.
The accepted answer a that question Lo pregunté fue lo que hice, pero simplemente no me siento del todo bien. Casi parece que algo podría pasarle a los datos entre la activación ManuelResetEvent y el programa que recupera los datos y los devuelve.
Actualización: El principal problema con el Auto/ManualResetEvent
es que es demasiado vulnerable. Un hilo podría esperar el evento y luego no dar tiempo suficiente para que nadie lo obtenga antes de cambiarlo a otra cosa. ¿Hay alguna manera de usar bloqueos o algo más? Tal vez usando declaraciones get y set.
¿qué pasa con un bucle while: 'while (someGlobalvar);' 'cahnge someGlobalvar' en una función que ASIGN al evento. – elyashiv
está en espera activa, y es una muy mala solución –
Ahora, 2 años después, parece que debería simplemente hacer WaitTwo que devolvería un objeto, y '* ResetEvent.Set (datos de objeto)'. Todavía tendría que preocuparme por las referencias a los objetos, pero eso es normal. Al menos el puntero no cambiaría. –