我有一个像“ClientSocket.cs”这样的类
class ClientSocket {
public delegate void ConnectHandler(object sender, EventArgs e);
public event ConnectHandler ConnectEvent = delegate { };
protected void OnConnectEvent(EventArgs e) {
ConnectHandler ev = ConnectEvent;
ev(this, e);
}
}
还有另一个类“myForm.cs”
public partial class myForm : Form {
private ClientSocket client;
private void button1_Click(object sender, EventArgs e) {
client = new ClientSocket();
client.ConnectEvent += myForm_OnConnectEvent;
client.connect();
}
// Handler for ConnectEvent
private void myForm_OnConnectEvent(object sender, EventArgs e) {
//this.BeginInvoke((MethodInvoker)delegate { writeLog("Connected"); });
writeLog("Connected");
}
// Function that write a log string to a TextBox
public writeLog(string log) {
guiTextBox.AppendText(log);
}
}
这里的问题。我尝试使用 BeginInvoke 调用 writeLog 或直接调用它。有时我在写入 guiTextBox 时会收到 InvalidOperationException。我不明白为什么我会收到那条消息。该事件由 ClientSocket 对象触发,但事件处理程序与主 UI 线程 (myForm) 相关。
我可以避免对班级的每个 EventHandler 使用 BeginInvoke/Invoke 吗?
编辑:我明白有什么区别,现在我试图了解调用事件的最佳实践。
在 BASE 类中引发事件时我是否应该放置 BeginInvoke/Invoke 方法(在这种情况下为 ClientSocket)
protected void OnConnectEvent(EventArgs e) {
ConnectHandler ev = ConnectEvent;
this.BeginInvoke((MethodInvoker)delegate { ev(this, e);});
}
或者我应该在使用该对象时将其放入该对象并向该处理程序添加一个侦听器
// Handler for ConnectEvent used in GUI (myForm)
private void myForm_OnConnectEvent(object sender, EventArgs e) {
this.BeginInvoke((MethodInvoker)delegate { writeLog("Connected"); });
}
干杯