C # Winforms и NetworkStream.BeginRead (), как открыть новую форму на основе сетевого события? - PullRequest
1 голос
/ 01 марта 2012

У меня серьезные проблемы с установлением связи между потоками, работающими между NetworkStream.BeginRead () и классом WinForms (я настоящий новичок, когда речь идет о таких темах, как многопоточность и асинхронные вызовы).

В частности, я подключен к удаленному клиенту через сетевой сокет, просто слушая события. Получив его, я могу правильно собрать его в строку, используя методы NetworkStream BeginRead () и EndRead (), без проблем. Я намереваюсь открыть новую форму (используя строку в качестве параметра в конструкторе формы), чтобы информация могла отображаться пользователю. По сути, сетевое событие вызовет форму для открытия пользователя и информации. Однако я постоянно сталкиваюсь с исключениями CrossThreadMessagingException, и я недостаточно знаком с делегатами, и я убежден, что я все делаю правильно. Может ли кто-нибудь указать мне правильное направление?

1 Ответ

1 голос
/ 01 марта 2012

Правило таково: «Вы можете получить доступ только к элементам управления в потоке, в котором они были созданы»

Вы асинхронные обратные вызовы возвращаются в другом потоке, поэтому вам необходимо выполнить маршалинг обратно в поток пользовательского интерфейса, если выхотите общаться между формами.

Предполагая, что код NetworkStream уже находится в форме, вам просто нужно использовать Invoke или BeginInvoke.Например:

private void MyAsyncCallback(IAsyncResult ar)
{
    var yourString = ...from your socket...;
    this.Invoke(new MethodInvoker(() => new Form(yourString)));
}
...