Проблема с делегатами и событиями

Я хочу использовать событие и делегата для написания текста в RichTextBox. Я использую темы с BackGroundWorker, и мне нужен делегат. Я нашел этот пример, который отлично работает для меня, это 1 класс, который создает делегат, событие и функцию множественного числа, и другой файл, который является формой. Рабочий класс:

    namespace SolucionRichTextBox
{
    class Work
    {
        //delegado
        public delegate void work(string notificacion);
        //evento
        public event work working;
        //metodo trabajando
        public void trabajando()
        {
            for(int i = 0; i <= 100; i++)
            {
                if (i % 2 == 0)
                working(i.ToString());
            }
        } 
    }
}

И файл формы, который это.

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void btnEmpezar_Click(object sender, EventArgs e)
        {
            Work w = new Work();
            //Delegado que tiene el metodo notificar
            w.working += new Work.work(notificar);
            //Creamos un nuevo hilo y cuando se crea llama a la funcion trabajando
            Thread t = new Thread(w.trabajando);
            //Inicia el hilo
            t.Start();

        }
        //Metodo que se ejecutara en otro hilo y escribe en el box
        public void notificar(string notificacion)
        {
            if (InvokeRequired)
                Invoke(new Action(() => richTextBox1.Text += notificacion +"\n"));
        }
    }
}

Теперь я пытаюсь экстраполировать на мою реальную проблему, и я не понимаю, почему это не работает. Я сделал это.

//Escribir con un delegado en el richTextBox
        //Creo un delegado de la clase
        private delegate void delegado(string notificaciones);

        //Creo un evento del delegado
        private event delegado Evento;

        //Asocio el evento al metodo notificar
        Evento += new delegado(notificar);

        public void notificar(string notificacion)
        {
            if (InvokeRequired)
                Invoke(new Action(() => BoxText.Text += notificacion + "\n"));
        }
        //Boton enviar. Empieza la funcion en segundo plano, y al llamar a RunWorker llama a Dowork.
        private void enviar_Click(object sender, EventArgs e)
        {
            if (backgroundWorker1.IsBusy != true)
            {
                //inicia el proceso
                backgroundWorker1.RunWorkerAsync();
            }
        }

Событие + = новый делегат (уведомление); В этой строке выдается ошибка. Имя Событие не существует в текущем контексте. Новый уведомитель не подходит для этого элемента и (уведомить) тип имен не был идентифицирован. Я был здесь в течение нескольких дней и нескольких вопросов, и это казалось лучшим решением, но я был с C # 2 недели и никогда не обрабатывал темы (они доставляют мне много головной боли). И что я действительно хочу, так это иметь графический интерфейс пользователя в фоновом режиме и, когда он закончится, показывать его в RTB, он закончен или ошибки, которые он выдает.

1
задан 27.11.2019, 14:33
1 ответ

Только ты можешь можешь подписывать делегат или метод в событие внутри метода или в строителе . Ты не можешь делать это в заявлении класса:

NombreConstructor(){    
    //Asocio el evento al metodo notificar
    Evento += new delegado(notificar); // funciona perfectamente
}

public void notificar(string notificacion){
    if (InvokeRequired)
        Invoke(new Action(() => BoxText.Text += notificacion + "\n"));
}

полный Код:

NombreConstructor(){    
    //Asocio el evento al metodo notificar
    Evento += new delegado(notificar);
}

//Escribir con un delegado en el richTextBox
//Creo un delegado de la clase
private delegate void delegado(string notificaciones);

//Creo un evento del delegado
private event delegado Evento;

public void notificar(string notificacion){
    if (InvokeRequired)
        Invoke(new Action(() => BoxText.Text += notificacion + "\n"));
}
//Boton enviar. Empieza la funcion en segundo plano, y al llamar a RunWorker llama a Dowork.
private void enviar_Click(object sender, EventArgs e){
    if (backgroundWorker1.IsBusy != true){
        //inicia el proceso
        backgroundWorker1.RunWorkerAsync();
    }
}

, Где NombreConstructor, - имя строителя класса.

2
ответ дан 01.12.2019, 10:46
  • 1
    Спасибо, он знал, что она была бы простой ошибкой. – cupax64 28.11.2019, 09:30