C# 如何在两个类之间使用事件

C# 如何在两个类之间使用事件,c#,class,events,C#,Class,Events,我有一个带有事件的类,然后在另一个.cs文件中我有另一个订阅事件的类。但该事件从未成功触发,并且由于某些原因,该事件为空。我做错了什么 头等舱: class TestClass { public static void CountStart() { int CountVal = 0; do { CountVal = CountVal + 1; if (CountVal % 5 ==

我有一个带有事件的类,然后在另一个.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 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");
    }
}

我尝试了在“”中遵循答案,但似乎不起作用。

事件处理程序与类的实例关联(
SimpleEventSender

您正在创建多个
SimpleEventSender
实例:

  • Form1
    构造函数中的一个,您可以在其中订阅事件
  • CountStart
    每5次迭代一次,在该迭代中引发事件-但在没有任何订阅者的新实例
    SimpleEventSender
几乎可以肯定的是,您希望使用一个
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);
    }
}
//表单现在保留对SimpleEventSender实例的引用
公共部分类Form1:Form
{
私有只读SimpleEventSender事件发送者;
公共表格1()
{
eventSender=新的SimpleEventSender();
eventSender.NewEvent+=新事件;
初始化组件();
}
私有无效按钮1\u单击(对象发送者,事件参数e)
{
TestClass class1=新的TestClass();
TestClass.CountStart(eventSender);
}
public void new_事件(对象发送方,事件参数e)
{
MessageBox.Show(“达到5的倍数”);
}
}
//TestClass现在*接受*EventSender,而不是创建自己的实例
类TestClass
{
公共静态void CountStart(SimpleEventSender事件发送者)
{
//将变量名修改为更常规的名称
//“for”循环也更为惯用
整数计数=0;
做
{
计数++;
如果(计数%5==0)
{
eventSender.StartEvent();
}
睡眠(1000);
}而(计数<100);
}
}

事件处理程序与类的实例关联(
SimpleEventSender

您正在创建多个
SimpleEventSender
实例:

  • Form1
    构造函数中的一个,您可以在其中订阅事件
  • CountStart
    每5次迭代一次,在该迭代中引发事件-但在没有任何订阅者的新实例
    SimpleEventSender
几乎可以肯定的是,您希望使用一个
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);
    }
}
//表单现在保留对SimpleEventSender实例的引用
公共部分类Form1:Form
{
私有只读SimpleEventSender事件发送者;
公共表格1()
{
eventSender=新的SimpleEventSender();
eventSender.NewEvent+=新事件;
初始化组件();
}
私有无效按钮1\u单击(对象发送者,事件参数e)
{
TestClass class1=新的TestClass();
TestClass.CountStart(eventSender);
}
public void new_事件(对象发送方,事件参数e)
{
MessageBox.Show(“达到5的倍数”);
}
}
//TestClass现在*接受*EventSender,而不是创建自己的实例
类TestClass
{
公共静态void CountStart(SimpleEventSender事件发送者)
{
//将变量名修改为更常规的名称
//“for”循环也更为惯用
整数计数=0;
做
{
计数++;
如果(计数%5==0)
{
eventSender.StartEvent();
}
睡眠(1000);
}而(计数<100);
}
}

这是因为您将此函数分配给SimpleEventSender实例的不同事件

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

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

公共静态void CountStart()
{
int CountVal=0;
做
{
CountVal=CountVal+1;
如果(CountVal%5==0)
{
//但这里您正在创建另一个SimpleEventSender实例,因此它没有任何订阅
SimpleEventSender EventSender=新的SimpleEventSender();
EventSender.StartEvent();
}
睡眠(1000);
}而(CountVal<100);
}

换句话说,您订阅Form1()构造函数中的一个对象,并从CountStart()函数中完全不同的对象调用“StartEvent()”函数。

这是因为您将此函数分配给SimpleEventSender实例的不同事件

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

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

公共静态void CountStart()
{
int CountVal=0;
做
{
CountVal=CountVal+1;
如果(CountVal%5==0)
{
//但这里您正在创建另一个SimpleEventSender实例,因此它没有任何订阅
SimpleEventSender EventSender=新的SimpleEventSender();
EventSender.StartEvent();
}
睡眠(1000);
}而(CountVal<100);
}

换句话说,您订阅Form1()构造函数中的一个对象,并从CountStart()函数中完全不同的对象调用“StartEvent()”函数。

您订阅一个事件处理程序以处理一个SimpleEventSender对象的事件。但是,您会引发另一个SimpleEventSender对象的事件,而您尚未订阅事件处理程序。你明白了吗?您必须订阅在其上引发事件的SimpleEventSender对象的事件。此外,使用C#6及更高版本,您可以将
EventHandler
中的
StartEvent
调用简化为
NewEvent?。调用(此,new EventArgs()/*或null*/)将事件处理程序订阅到一个SimpleEventSender对象的事件。但是你提高了