C# 如何在两个类之间使用事件
我有一个带有事件的类,然后在另一个.cs文件中我有另一个订阅事件的类。但该事件从未成功触发,并且由于某些原因,该事件为空。我做错了什么 头等舱:C# 如何在两个类之间使用事件,c#,class,events,C#,Class,Events,我有一个带有事件的类,然后在另一个.cs文件中我有另一个订阅事件的类。但该事件从未成功触发,并且由于某些原因,该事件为空。我做错了什么 头等舱: class TestClass { public static void CountStart() { int CountVal = 0; do { CountVal = CountVal + 1; if (CountVal % 5 ==
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
每5次迭代一次,在该迭代中引发事件-但在没有任何订阅者的新实例CountStart
上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
每5次迭代一次,在该迭代中引发事件-但在没有任何订阅者的新实例CountStart
上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对象的事件。但是你提高了