在类下隐藏invoke所需的代码

时间:2015-12-22 08:36:42

标签: c# multithreading invoke

在某些课程中我声明了这样的事件:

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);
}

1 个答案:

答案 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);
      });
}