Tuve una confusión similar y honestamente encuentro las respuestas aquí para ser confuso. Aunque un par insinuó soluciones que luego encontraría que funcionarían.
Mi solución fue llegar a los libros y familiarizarme con los delegados y los controladores de eventos. Aunque he usado ambos durante muchos años, nunca estuve íntimamente familiarizado con ellos. http://www.codeproject.com/Articles/20550/C-Event-Implementation-Fundamentals-Best-Practices da la mejor explicación de los delegados y controladores de eventos que he leído y explica claramente que una clase puede ser un editor de eventos y tener otras clases que los consumen. En este artículo: http://www.codeproject.com/Articles/12285/Implementing-an-event-which-supports-only-a-single se describe cómo lanzar eventos solo a un controlador, ya que los delegados son multidifusión por definición. Un delegado hereda el sistema. MulticastDelegate más, incluidos los delegados del sistema, son Multidifusión. Descubrí que multidifusión significaba que cualquier controlador de eventos con la misma firma recibiría el evento planteado. El comportamiento de multidifusión me ha causado algunas noches de insomnio mientras revisaba el código y veía mi evento aparentemente erróneamente enviado a los controladores que no tenía intención de conseguir este evento. Ambos artículos explican este comportamiento. El segundo artículo muestra una forma, y el primer artículo muestra otra, haciendo que el delegado y la firma estén bien escritos. Personalmente creo que la tipificación fuerte evita errores estúpidos que pueden ser difíciles de encontrar. Así que votaría por el primer artículo, aunque obtuve el código del segundo artículo funcionando. Solo tenía curiosidad. :-)
También me llamó la atención si podía obtener el código de artículos # 2 para comportarme de la misma forma en que interpreté la pregunta original anterior. Independientemente de su enfoque elegido o si también estoy malinterpretando la pregunta original, mi verdadero mensaje es que todavía creo que se beneficiaría al leer el primer artículo como lo hice, especialmente si las preguntas o respuestas en esta página lo dejan confundido. Si tiene pesadillas de multidifusión y necesita una solución rápida, entonces el artículo 2 puede ayudarlo.
Empecé a jugar con la clase eventRaiser del segundo artículo. Hice un proyecto de formulario de Windows simple. Agregué la segunda clase de artículos EventRaiser.cs a mi proyecto. En el código del formulario principal, que define una referencia a esa clase EventRaiser en la parte superior como
private EventRaiser eventRaiser = new EventRaiser();
añadí un método en el código principal forma que quería ser llamado cuando el evento fue despedido
protected void MainResponse(object sender, EventArgs eArgs)
{
MessageBox.Show("got to MainResponse");
}
continuación, en el constructor de la forma principal por la que añade la asignación de eventos:
eventRaiser.OnRaiseEvent += new EventHandler(MainResponse);`
luego, creamos una clase que se crea una instancia por mi forma principal se llama "Si mpleClass "por falta de ingenio creativo en este momento.
Luego añade un botón y en el evento de clic del botón que la instancia del código SimpleClass quería provocar un evento de:
private void button1_Click(object sender, EventArgs e)
{
SimpleClass sc = new SimpleClass(eventRaiser);
}
Nota la instancia de "eventRaiser" que pasé a SimpleClass.cs . Eso fue definido e instanciado anteriormente en el código de formulario principal.
En los SimpleClass:
using System.Windows.Forms;
using SinglecastEvent; // see SingleCastEvent Project for info or http://www.codeproject.com/Articles/12285/Implementing-an-event-which-supports-only-a-single
namespace GenericTest
{
public class SimpleClass
{
private EventRaiser eventRaiser = new EventRaiser();
public SimpleClass(EventRaiser ev)
{
eventRaiser = ev;
simpleMethod();
}
private void simpleMethod()
{
MessageBox.Show("in FileWatcher.simple() about to raise the event");
eventRaiser.RaiseEvent();
}
}
}
El único punto en el método privado llamé SimpleMethod fue verificar que un método de ámbito privado todavía podría provocar el evento, no es que lo dudaba, pero me gusta estar positivo.
Ejecuté el proyecto y esto dio como resultado el aumento del evento del "método simple" de "SimpleClass" hasta el formulario principal y el método correcto esperado llamado MainResponse que demuestra que una clase puede generar un evento que es consumido por una clase diferente. Sí, el evento tiene que plantearse desde dentro de la clase que necesita su cambio de transmisión a otras clases que se preocupan. Las clases de recepción pueden ser de una clase o de muchas clases, dependiendo de qué tan fuertemente las haya tipeado o si las ha lanzado como en el segundo artículo.
Espero que esto ayude y no enturbie el agua. Personalmente, tengo muchos delegados y eventos para limpiar. ¡Los demonios multicast se han ido!
Este antiguo puesto plantea un problema que puede evitarse fácilmente utilizando un concentrador evento como [TinyMessenger ] (https://github.com/grumpydev/TinyMessenger). – Larry