【问题标题】:Hide invokerequired code under the class隐藏类下的invokerequired代码
【发布时间】: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


【解决方案1】:

您可以为此创建一个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);
      });
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-21
    • 1970-01-01
    • 1970-01-01
    • 2011-01-22
    • 2023-03-27
    • 1970-01-01
    • 2018-06-13
    • 1970-01-01
    相关资源
    最近更新 更多