Threading, Winforms, отделяя операции TCP от формы главного окна - PullRequest
1 голос
/ 22 августа 2011

В форме основного окна у меня есть кое-что по TCP / IP.Сейчас я занимаюсь рефакторингом, поэтому все в отдельных классах.Я выделил эти функции (теперь TCP обрабатывается классом Communicator), но я только что заметил, что

this.Invoke(PDDelegate, new Object[] { tempstr });

эта часть зависит от некоторой инфраструктуры в классе Form.Это то, что настраивает делегата для обработки данных, которые поступают по каналу TCP.

Я испытываю желание передать ссылку на главное окно, когда я вызываю Communicator.Connect, поэтому я могу сделать

window.Invoke(PDDelegate, new Object[] { tempstr });

Но мне это кажется просто хаком.Мне интересно, стоит ли мне беспокоиться об этом и выяснить, как дать этому объекту возможность обрабатывать свои собственные потоки или просто передать указатель.

Ответы [ 2 ]

1 голос
/ 22 августа 2011

Возможно, лучший способ - использовать модель событий .NET. Пусть класс Communicator реализует событие, а форма подписывается на это событие. Таким образом, у вас есть четкое разделение обязанностей.

В коммуникаторе:

public delegate void CommEventHandler(object sender, CommEventArgs e);
public event CommEventHandler CommEvent;

И тогда коммуникатор вызывает CommEvent, когда это необходимо.

В форме создайте коммуникатор и подпишитесь на событие:

private Communicator Comm = new Communicator();
Comm.CommEvent += MyCommEventHandler;

Форма должна затем вызвать Invoke, если требуется обновить интерфейс.

Эта модель избавляет коммуникатора от необходимости что-либо знать о формах.

0 голосов
/ 22 августа 2011

Да, это взлом, все в порядке.

Для связи через сокеты я рекомендую подход, основанный на SynchronizationContext. например, библиотека Nito.Async.Sockets использует SynchronizationContext для перенаправления результатов обратно в поток пользовательского интерфейса без создания зависимости от Windows Forms.

Кроме того, вы можете написать свои собственные обертки на основе Rx . Я думаю, что это была бы хорошая идея, но более сложная.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...