在自定义类中定义事件,在窗体上注册并调用事件处理函数怎么还会出现无法操作控件的问题的啊?
我想实现一个自定义类,其中定义了一个事件。这样在主窗体中只要向类注册这个事件处理函数就可以接收并处理类发出的事件。我的代码是这样的:
public delegate void ReceiveHandler(object sender, MyMessage e);
class CThreadMessage
{
public static event ReceiveHandler receiveEventHandler;
public CThreadMessage()
{
}
public static void TestClickNum()
{
int iClickTemp = 0;
iClickTemp = Program.g_iClickNum;
MyMessage thisMessage = new MyMessage(iClickTemp);
if (iClickTemp % 5 ==0)
{
if (receiveEventHandler != null)
{
receiveEventHandler(null, thisMessage);
}
}
}
}
public class MyMessage : EventArgs
{
public int ClickNum = 0;
public MyMessage(int ClickNum)
{
this.ClickNum = ClickNum;
}
}
然后在主窗体中:
{
public frmThreadMessage2()
{
InitializeComponent();
}
private void frmThreadMessage2_Load(object sender, EventArgs e)
{
CThreadMessage.receiveEventHandler += new ReceiveHandler(MyMessageHandler);
}
private void MyMessageHandler(object sender, MyMessage e)
{
int iClickNum = e.ClickNum;
label1.Text += iClickNum.ToString() + "\r\n"; //执行到这里就出错,不能操作标签控件
}
}
类是静态的,在另一个窗体上通过线程触发的:
private void frmThreadMessage_Load(object sender, EventArgs e)
{
frmThreadMessage2 form2 = new frmThreadMessage2();
form2.Show();
//testMessage.receiveEventHandler += new ReceiveHandler(MyMessageHandler);
CThreadMessage.receiveEventHandler += new ReceiveHandler(MyMessageHandler);
thread = new Thread(new ThreadStart(StartThread));
thread.Start();
}
private void StartThread()
{
while (true)
{
CThreadMessage.TestClickNum();
}
}
难道主窗体自己的事件处理函数是在工作线程中执行的吗???
我想实现的最终效果就是:将类和主程序独立开来,类自身在线程中工作,主窗体程序只需要向其注册主程序自己的事件处理函数即可。类中触发事件后主程序的事件处理函数自动被调用。