Как уменьшить повторение при обновлении элементов управления GUI из других потоков? - PullRequest
2 голосов
/ 19 сентября 2011

Написание серверного приложения, и мой код начинает становиться немного .. повторяющимся .. Посмотрите:

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.Есть ли еще лучший способ обновления графического интерфейса из других потоков?Если что-то изменилось, я использую tasks для реализации потоков на моем сервере.

1 Ответ

3 голосов
/ 19 сентября 2011

Вы можете заключить повторяющуюся логику в другой метод:

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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...