【发布时间】:2015-12-22 08:36:41
【问题描述】:
在某些类中,我声明了这样一个事件:
public delegate void UserOfflineHandler(string ip);
public event UserOfflineHandler OnUserOffline;
然后生成事件
void srvSomeFunc(string ip)
{
OnUserOffline(ip);
}
在我的表单上我创建了一个事件处理程序
srv = new ServerClass();
srv.OnUserOffline += srv_OnUserOffline;
在srv_OnUserOffline 内部我想使用 ListBox,所以我使用委托
delegate void UpdateUserListCallback(string s);
private void updateUserList(string s)
{
if (listBox2.InvokeRequired)
{
UpdateUserListCallback dt = new UpdateUserListCallback(updateUserList);
Invoke(dt, new object[] { s });
}
else
{
//some work with listbox
}
}
我怎样才能把它放在我的ServiceClass 中,而不是放在表单的代码中?所以在表单的代码中我只会得到这样的东西:
srv.OnUserOffline += srv_OnUserOffline;
...
void srv_OnUserOffline(string login)
{
listbox2.Add(login);
}
【问题讨论】:
-
从不,从不隐藏 InvokeRequired。尤其是永远不要隐藏 Invoke(),这是一种很容易造成死锁的方法。您永远不想隐藏程序中非常昂贵(数百微秒)并且很容易导致程序因无法调试的可怕事故而失败的部分。这是一个不便的事实,您应该非常强烈地避免使用。它需要伤害,如果你隐藏它,那么你几乎可以保证创建一个糟糕的程序。
-
@HansPassant 我百分百支持你。不要试图隐藏诸如此类的关键部分,特别是因为界面相关代码应该保留在界面中!
标签: c# multithreading invoke