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 スレッドがビジーであるため、OnModuleInitializationComplete の実行には至りません。このスレッドは何をしに行くのですか?ある時点で (EndInvoke を呼び出すなどの) 待機を開始しますか?

InvokeRequired が false を返し、CheckIfAllModulesInitComplete メソッドがハングしています。

OnModuleInitializationComplete にさらにログを追加して、どのパスが使用されたかを示すために、新しい情報で質問を更新します。
このメソッドの周りのコードの詳細も提供できる場合は、特にこのメソッドの完了を待機するすべての場所で役立つ可能性があります。

于 2011-04-28T11:36:19.317 に答える
1

InvokeRequired の後、BeginInvoke 呼び出しの前にログ メッセージを追加します。

おそらく何か他のものを待っているために、UI スレッドがビジーであるため、BeginInvoke のブロックであると思われます。

于 2011-04-28T11:46:18.803 に答える
0

ほとんどの場合、デッドロックを引き起こすある種の競合状態があります。または、デバッグ情報が台無しになっていて、それが実際にブロックしている行ではありません。

于 2011-04-28T11:17:38.100 に答える