c # backgroundworker для сокетов - PullRequest
       2

c # backgroundworker для сокетов

0 голосов
/ 03 августа 2010

Я работаю над приложением C # для Windows.Это приложение в основном связано с сокетами.

У меня есть класс, называемый tcpsocket, который обрабатывает все функции уровня сокетов отправки, получения данных и т. Д. Класс контроллера вызывает этот tcpsocket.Кроме того, он выполняет всю остальную работу по записи данных в файл и обновлению графического интерфейса.Я думал, что было бы хорошо иметь этот контроллер в фоновом режиме, чтобы гарантировать, что графический интерфейс всегда реагирует.Прежде всего, это хорошая идея сделать это?

Поскольку я пытаюсь это сделать, я сталкиваюсь с проблемой, связанной с обработчиком прогрессирующего изменения для фонового работника.Я хочу иметь возможность отображать состояние подключения (тип: String) в текстовом поле и данные, отправляемые / полученные приложением (тип: Byte []) в richTextBox.Поскольку контроллер может отправлять данные в графический интерфейс только через событие progressChanged, как я могу передать различные типы данных (String / byte []) в графический интерфейс?

1 Ответ

0 голосов
/ 03 августа 2010

Если вы решили запустить контроллер в другом потоке, отличном от потока пользовательского интерфейса, вам нужно будет перехватить событие progressChanged из контроллера в обработчик метода в потоке пользовательского интерфейса.После того, как вы это сделаете, вам нужно будет перенаправить данные, возвращенные из события processChanged, в поток пользовательского интерфейса.Ниже приведен пример того, как выполнить маршалинг.

private object _lock = new object(); //should have class scope

private void DispalyMessage(byte[] bytes)
{
  if (this.InvokeRequired)
  {
    lock (_lock)
    {
      EventHandler d = new EventHandler(DispalyMessage);
      this.Invoke(d, new object[] { bytes });
      return;
    }
  }
  else
  {
    //the bytes data has been marshaled from the controller class thread to the ui thread and can be used at will to populate a memeber of the ui.
  }
}

Кроме того, вам может потребоваться изменить контроллер и добавить другие события, которые могут возвращать что-то отличное от типа: byte [].Вы можете сделать это, просто используя класс универсального делегата , который является частью .net framework, или вы можете напрямую использовать класс делегата. Вот документация Microsoft на делегатов.

Наслаждайтесь!

...