InvokeRequired зависает - PullRequest
       11

InvokeRequired зависает

2 голосов
/ 28 апреля 2011

Поток пользовательского интерфейса иногда зависает в операторе 'if (this.InvokeRequired)' в следующем методе.

Можете ли вы помочь мне определить причину проблемы

  public void OnModuleInitializationCompleted(object sender, EventArgs e)
  {
    ModuleStatusWindow.Logger.LogMessage("OnModuleInitializationCompleted", LogMessageType.Information, "Received {0}", (sender as IModule).Name);
    if (this.InvokeRequired)
    {
      this.BeginInvoke(new ECEventsHandler(OnModuleInitializationCompleted), sender, e);
    }
    else
    {
      CheckIfAllModulesInitComplete();
    }
  }

  private void CheckIfAllModulesInitComplete()
  {
    ModuleStatusWindow.Logger.LogMessage("CheckIfAllModulesInitComplete", LogMessageType.Information, "Enter >>");
    this._moduleStatusGrid.DataSource = this._moduleDataList.ToArray();
    this._moduleStatusGrid.Invalidate();
    ModuleStatusWindow.Logger.LogMessage("CheckIfAllModulesInitComplete", LogMessageType.Information, "Updated grid control...");
    if (this._moduleDataList.Count(moduleData => !moduleData.IsInitOver) == 0)
    {
      this._footprint.DeActivate();
      ModuleStatusWindow.Logger.LogMessage("CheckIfAllModulesInitComplete", LogMessageType.Information, "Stopping message listenr...");
      ClientMessageListner.Stop();
      ModuleStatusWindow.Logger.LogMessage("CheckIfAllModulesInitComplete", LogMessageType.Information, "Closing Window...");
      this.Close();
    }
    ModuleStatusWindow.Logger.LogMessage("CheckIfAllModulesInitComplete", LogMessageType.Information, "Leave <<");
  }

Ответы [ 3 ]

1 голос
/ 28 апреля 2011

Не думаю, что InvokeRequired может зависнуть. BeginInvoke может, но я не думаю, что это будет.

Мало идей.

BeginInvoke работает правильно, но поток пользовательского интерфейса занят, поэтому он никогда не переходит к выполнению OnModuleInitializationComplete. Что этот поток продолжает делать? Начинается ли ожидание (например, вызов EndInvoke) как какой-то момент?

InvokeRequired возвращает false, а ваш метод CheckIfAllModulesInitComplete зависает.

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

1 голос
/ 28 апреля 2011

Я бы добавил сообщение в журнал после InvokeRequired и перед вызовом BeginInvoke.

Я подозреваю, что это блокировка BeginInvoke, потому что поток пользовательского интерфейса занят, возможно, потому, что он ожидает чего-то другого.

0 голосов
/ 28 апреля 2011

Скорее всего, у вас есть какое-то состояние гонки, что приводит к тупику.Или ваша отладочная информация испорчена, и это не та строка, которая блокирует.

...