InvokeRequired зависает

Поток пользовательского интерфейса иногда зависает в операторе 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 ответа

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

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

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

Мало идей.

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

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

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

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

Другие вопросы по тегам