Странная ошибка лейбла. не позволю мне установить текст, почему это? - PullRequest
0 голосов
/ 24 февраля 2012

Я получаю структуру из серверного приложения, и когда клиентская программа получает ее и ее тип serverInfo, она отправляет ее функции и устанавливает информацию о сервере для меток.Я поставил MessageBox.Show () на обоих концах, чтобы увидеть, что не так, и первый всплывает, а второй нет.Первое окно сообщения показывает информацию из структуры, полученной с сервера, и все правильно, так что я знаю, что это работает.Я также поместил окно сообщения между каждым из label.text = text, и они не показывались.Я также попытался просто поставить на них «это тестовая строка», и они все еще ничего не делали.

Редактировать * это WinForms

Редактировать * Я обнаружил, что это проблема перекрестной потоковтак какой хороший способ поменять метки из другого потока?

private void onServerInfo(msgBox message)
{
    serverInfo.info info = (serverInfo.info)message.getMessage("info");
    MessageBox.Show(info.name + " ; " + info.type + " ; " + info.limit); // works with everything showing up right
    ServerName.Text = info.name; //this is a string
    ServerType.Text = info.type.ToString(); // this is a enum
    MaxLimit.Text = info.limit.ToString(); // this is a int
    MessageBox.Show(ServerName.Text + " ; " + ServerType.Text + " ; " + MaxLimit.Text); // doesnt ever show
}

Ответы [ 2 ]

1 голос
/ 24 февраля 2012

Прежде всего позвольте мне заверить вас, что в показанном вами фрагменте кода нет ничего плохого - проблема в другом.

Дело в том, что ваша точка останова находится на линии ServerName.Text, но не на следующей строке, что означает, что эта строка вызывает исключение.

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

Одна из вещей, которую вы можете сделать в Visual Studio, это зайти в меню «Отладка» и выбрать пункт «Exceptoins ...». Появившееся диалоговое окно позволит вам убедиться, что отладчик остановится и на проглоченных исключениях, это может пролить некоторый свет на ситуацию и может быть полезным методом отладки.

Первое, что вам нужно сделать, это выяснить, какое исключение выдается. Это даст вам новую информацию для работы. Один из способов выяснить это я объяснил выше, но иногда, когда выдается и вылавливается много исключений, это не очень практично. В этом случае вы можете временно заключить код проблемы в блок try / catch, например:

private void onServerInfo(msgBox message)
{
    try 
    {
      serverInfo.info info = (serverInfo.info)message.getMessage("info");
      MessageBox.Show(info.name + " ; " + info.type + " ; " + info.limit); // works with everything showing up right
      ServerName.Text = info.name; //this is a string
      ServerType.Text = info.type.ToString(); // this is a enum
      MaxLimit.Text = info.limit.ToString(); // this is a int
      MessageBox.Show(ServerName.Text + " ; " + ServerType.Text + " ; " + MaxLimit.Text); // doesnt ever show
    }
    catch (Exception ex)
    {
      MessageBox.Show(ex.Message);
    }
}

Поставьте точку останова на MessageBox.Show(ex.Message); и проверьте содержимое исключения. Это позволит вам продвинуться в решении вашей проблемы.

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

Как заметил кто-то другой, скорее всего проблема в том, что вы пытаетесь получить доступ к элементу пользовательского интерфейса, не являющемуся потоком пользовательского интерфейса, что недопустимо в приложении .NET. Подробнее об этом можно прочитать здесь Как выполнить потоковые вызовы для элементов управления Windows Forms . Основная идея заключается в том, что вам нужно использовать методы InvokeRequired / Invoke в элементах управления вашего пользовательского интерфейса для доступа к ним из другого потока.

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

1 голос
/ 24 февраля 2012

Поскольку ваше исключение вызвано межпоточным исключением, используйте этот удобный метод, чтобы исправить это:

https://stackoverflow.com/a/2242393/555547

Так что отредактируйте свой класс так:

/// <summary>
  /// Extension method that allows for automatic anonymous method invocation.
  /// </summary>
  public static void Invoke(this Control c, MethodInvoker mi)
  {
     c.Invoke(mi);

     return;
  }


private void onServerInfo(msgBox message)
{
this.Invoke
(
   () =>
   {
    serverInfo.info info = (serverInfo.info)message.getMessage("info");
    MessageBox.Show(info.name + " ; " + info.type + " ; " + info.limit); // works with everything showing up right
    ServerName.Text = info.name; //this is a string
    ServerType.Text = info.type.ToString(); // this is a enum
    MaxLimit.Text = info.limit.ToString(); // this is a int
    MessageBox.Show(ServerName.Text + " ; " + ServerType.Text + " ; " + MaxLimit.Text); // doesnt ever show
   }
);
}

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

Редактировать: На самом деле вы должны поместить этот метод расширения в его собственный статический класс, иначе вы получите ошибку.

...