Неожиданное исключение перекрестной нити - PullRequest
1 голос
/ 30 октября 2009

Следующий метод запускается из конструктора UserControl. Выдано исключение кросс-потока, но я не могу сказать, почему:

 public override void Populate()
 {
  base.Populate ();
  LoadEditableList(IEditableList);

  ThreadStart fix = null;
  fix = delegate()
  {
   if (InvokeRequired)
   {
    Invoke(fix);
   }
   else
   {
    buttonAdd_Click(null, null);
   }
  };
  var thread = new Thread(fix);
  thread.Start();
 }

Метод buttonAdd_Click добавляет элемент в ListView. Странно, я избегаю этой ошибки, если добавляю точку останова к строке if (InvokeRequired). Это очень похоже на схему, которую я написал десятки раз, я подозреваю, что что-то упустил из-за синдрома отсутствия сна у нового ребенка.

Ответы [ 2 ]

2 голосов
/ 30 октября 2009

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

Просто для теста, если вы сначала вызовите Control.Handle, например:

IntPtr handle = Handle;

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

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

1 голос
/ 30 октября 2009

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

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