Windows Forms исключение перекрестного обмена сообщениями

#c#-4.0

#c #-4.0

Вопрос:

В моем проекте у меня есть класс «C1», где я постоянно прослушиваю клиентов, если от клиента получено какое-либо сообщение, мне нужно обновить текст моего текстового поля в классе формы. Я использую делегат для этого, созданный в классе «C1», и я использовал его в своей форме.cs в этой функции я обновляю свое текстовое поле.

Пожалуйста, помогите мне

Комментарии:

1. От вас недостаточно информации. Как вы слушаете клиентов? Использование HttpWebRequest?

Ответ №1:

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

Вы могли бы сделать что-то вроде следующего:

 private void UpdateText(string text)
{
   if (textBox1.InvokeRequired)
      textBox1.Invoke(new Action(() => UpdateText(text)));
   else
      textBox1.Text = text;                     
}
  

который проверит, вызывается ли метод в потоке пользовательского интерфейса, и, если нет, передаст запрос в поток пользовательского интерфейса перед обновлением текста. Если вам нужно асинхронное поведение, вы можете использовать textBox1.BeginInvoke вместо textBox1.Invoke .

Для получения дополнительной информации см., Например, Эту статью MSDN.

Комментарии:

1. но я получаю данные в другом классе, оттуда я использую делегат для обновления текстового поля, появляется ошибка, пожалуйста, помогите мне

2. Можете ли вы опубликовать часть кода, показывающего, как вы в настоящее время выполняете это обновление?

3. Мой класс не наследует класс Form, но я вызываю список класса Form из обычного класса c # с помощью делегатов, как я могу это сделать