2

UI 线程偶尔会在以下方法中的语句“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 <<");
  }
4

3 回答 3

1

我会在 InvokeRequired 之后和 BeginInvoke 调用之前添加一条日志消息。

我怀疑这是 BeginInvoke 阻塞,因为 UI 线程很忙,也许是因为它正在等待其他东西。

于 2011-04-28T11:46:18.803 回答
1

我不认为 InvokeRequired 可能会挂起。BeginInvoke 可能,但我认为不会。

很少的想法。

BeginInvoke 运行正常,但 UI 线程很忙,因此它永远不会运行 OnModuleInitializationComplete。这个线程继续做什么?它是否开始等待(比如调用 EndInvoke)?

InvokeRequired 返回 false 并且您的 CheckIfAllModulesInitComplete 方法挂起。

我会在 OnModuleInitializationComplete 中添加更多日志记录,以显示 If 的路径,然后使用新信息更新您的问题。
如果您还可以提供有关此方法的代码的更多详细信息,它可能会很有用,尤其是在等待此方法完成的任何地方。

于 2011-04-28T11:36:19.317 回答
0

很可能,你有某种导致死锁的竞争条件。或者,您的调试信息被弄乱了,这并不是真正的阻塞线。

于 2011-04-28T11:17:38.100 回答