在某些课程中我声明了这样的事件:
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);
}
答案 0 :(得分:0)
您可以为此创建extension方法,并将其与任何控件一起使用。
public static void InvokeIfRequired(this Control control, Action action)
{
if (control.InvokeRequired) {
control.Invoke(action);
} else {
action();
}
}
以下是您将如何使用它
//I would skip this check but left up to you
listBox2.InvokeIfRequired(() =>
{
// Do anything you want with the control here
UpdateUserListCallback dt = new UpdateUserListCallback(updateUserList);
Invoke(dt, new object[] { s });
});
最后
void srv_OnUserOffline(string login)
{
// here you are actually working with List so check Invoke only here
listBox2.InvokeIfRequired(() =>
{
listBox2.Add(login);
});
}