Как использовать событие между 2 классами - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть класс с событием, затем в другом файле .cs у меня есть другой класс, где я подписываюсь на событие.Но событие никогда не срабатывает успешно, и по какой-то причине событие является нулевым.Что я делаю не так?

Первый класс:

class TestClass
{
    public static void CountStart()
    {

        int CountVal = 0;
        do
        {
            CountVal = CountVal + 1;
            if (CountVal % 5 == 0)
            {
                SimpleEventSender EventSender = new SimpleEventSender();
                EventSender.StartEvent();
            }
            Thread.Sleep(1000);
        } while (CountVal < 100);
    }
}

Класс события:

public class SimpleEventSender
{
    public event EventHandler NewEvent;
    public void StartEvent()
    {
        if (NewEvent != null)
        {
            NewEvent(this,null);
        }

    }
}

И класс, в котором я подписываюсь на событие:

public partial class Form1 : Form
{
    public Form1()
    {
        SimpleEventSender newevent1 = new SimpleEventSender();
        newevent1.NewEvent += new_event;
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        TestClass class1 = new TestClass();
        TestClass.CountStart();


    }

    public void new_event(object sender, EventArgs e)
    {
        MessageBox.Show("multiple of 5 reached");
    }
}

Я пытался следовать ответам на " Уведомлять, когда событие из другого класса инициируется ", но, похоже, это не сработало.

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Это потому, что вы назначаете эту функцию другому событию экземпляра SimpleEventSender.

public Form1()
    {
        SimpleEventSender newevent1 = new SimpleEventSender();

        // You are subscribing to the event of this instance            
        newevent1.NewEvent += new_event;
        InitializeComponent();
    }

-

    public static void CountStart()
    {

        int CountVal = 0;
        do
        {
            CountVal = CountVal + 1;
            if (CountVal % 5 == 0)
            {

                // But here you are creating another instance of SimpleEventSender so it doesn't have anything subscribed to it
                SimpleEventSender EventSender = new SimpleEventSender();
                EventSender.StartEvent();
            }
            Thread.Sleep(1000);
        } while (CountVal < 100);
    }

Другими словами - вы подписываетесь на один объект вконструктор Form1 (), и вы вызываете функцию «StartEvent ()» из совершенно другого объекта в функции CountStart ().

0 голосов
/ 26 сентября 2018

Обработчики событий связаны с экземпляром класса (в данном случае SimpleEventSender).

Вы создаете несколько SimpleEventSender экземпляров:

  • Один в конструкторе Form1, где вы подписываетесь на событие
  • Одна каждые 5 итерацийCountStart, где вы вызываете событие - но в новом экземпляре SimpleEventSender, у которого нет подписчиков

Вы почти наверняка захотите использовать single экземпляр SimpleEventSender, например

// The form now retains a reference to the instance of SimpleEventSender
public partial class Form1 : Form
{
    private readonly SimpleEventSender eventSender;

    public Form1()
    {
        eventSender = new SimpleEventSender();
        eventSender.NewEvent += new_event;
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        TestClass class1 = new TestClass();
        TestClass.CountStart(eventSender);
    }

    public void new_event(object sender, EventArgs e)
    {
        MessageBox.Show("multiple of 5 reached");
    }
}

// TestClass now *accepts* an EventSender rather than creating its own instances
class TestClass
{
    public static void CountStart(SimpleEventSender eventSender)
    {
        // Variable name modified to be more conventional
        // A "for" loop would be more idiomatic too
        int count = 0;
        do
        {
            count++;
            if (count % 5 == 0)
            {
                eventSender.StartEvent();
            }
            Thread.Sleep(1000);
        } while (count < 100);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...