从其他线程更新GUI控件时如何减少重复?

时间:2011-09-18 23:44:03

标签: c# multithreading invoke

编写一个服务器应用程序,我的代码开始变得有点......重复..看看:

private void AppendLog(string message)
{
    if (txtLog.InvokeRequired)
    {
        txtLog.Invoke(new MethodInvoker(() => txtLog.AppendText(message + Environment.NewLine)));
    }
    else
    {
        txtLog.AppendText(message);
    }
}

private void AddToClientsListBox(string clientIdentifier)
{
    if (listUsers.InvokeRequired)
    {
        listUsers.Invoke(new MethodInvoker(() => listUsers.Items.Add(clientIdentifier)));
    }
    else
    {
        listUsers.Items.Add(clientIdentifier);
    }
}

private void RemoveFromClientsListBox(string clientIdentifier)
{
    if (listUsers.InvokeRequired)
    {
        listUsers.Invoke(new MethodInvoker(() => listUsers.Items.Remove(clientIdentifier)));
    }
    else
    {
        listUsers.Items.Remove(clientIdentifier);
    }
}

我正在使用.NET 4.0。还有没有更好的方法从其他线程更新GUI?如果它有任何不同,我使用tasks在我的服务器上实现线程。

1 个答案:

答案 0 :(得分:3)

您可以将重复逻辑封装在另一种方法中:

public static void Invoke<T>(this T control, Action<T> action) 
  where T : Control {
  if (control.InvokeRequired) {
    control.Invoke(action, control);
  }
  else {
    action(control);
  }
}

您可以这样使用:

listUsers.Invoke(c => c.Items.Remove(clientIdentifier));