Вызывать из другой темы - PullRequest
0 голосов
/ 25 апреля 2009

Я не могу в это поверить, это работает в моем другом приложении, но в этом, которое имеет похожую структуру - это не так!

    public string ListAdd
    {
        set
        {
            if (listView1.InvokeRequired)
            {
                this.Invoke((MethodInvoker)delegate
                {
                    listView1.Items.Add(value);
                });
            }
            else
            {
                listView1.Items.Add(value);
            }
        }
    }

Как я это называю:

        var formz = Form.ActiveForm as Form1;
        if (formz != null)
            formz.ListAdd = "asdasdasdasd";

Если я вызываю его из функции, где я получаю пакет (я хочу поместить его в listView) через TCP - ничего не происходит, но если я вызываю его в том же классе, где я инициализирую WinSock - это работает.

Где может быть проблема?

EDIT: Я только что отладил приложение, formz имеет значение null в месте, где я его вызываю (функция receive). Почему там ноль, а в другом месте нет?

Ответы [ 3 ]

2 голосов
/ 25 апреля 2009

Я не думаю, что это решит вашу проблему, но вы думали об использовании следующего шаблона для выполнения вызова? Я считаю это гораздо более читабельным. Создайте этот метод расширения.

public static class ControlExtension
{
   public static void ThreadSafeInvoke(this Control control, MethodInvoker method)
   {
      if (control != null)
      {
         if (control.InvokeRequired)
         {
            control.Invoke(method);
         }
         else
         {
            method.Invoke();
         }
      }
   }
}

И затем вы можете выполнять потоковые вызовы методов, как этот.

Form form = new Form();

form.ThreadSafeInvoke(() => form.Text = "ThreadSafeInvoke");

Или несколько вызовов одновременно.

form.ThreadSafeInvoke(() =>                 
{
   form.Text = "ThreadSafeInvoke";
   form.Visible = true;
   form.WindowState = FormWindowState.Maximized;
});

UPDATE

Итак, проблема явно в Form.ActiveForm возврате null.

  1. На момент звонка нет активной формы.
  2. Поток не имеет разрешения на получение активной формы - MSDN утверждает, что UIPermission требуется.
1 голос
/ 25 апреля 2009

Если ActiveForm возвращает значение NULL, то у вас может не быть активной формы или она не имеет формы Form1. Вы используете «как Form1», так что если у вас есть Form2, которая активна, то formz будет установлен в нуль.

Можете ли вы передать formz в функцию вместо вызова ActiveForm?

0 голосов
/ 08 июня 2011

Проверьте, находитесь ли вы в режиме отладки; Если это так, возвращаемое значение active form будет нулевым.

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