2

世界中のクライアントが使用するプログラムがあります。エラー ログを確認したところ、かなりの数で例外 (以下にリスト) がスローされているようで、実際には把握したり追跡したりできません。

いくつかの呼び出しがありますが、それらはすべて InvokeRequired によって保護されています。代わりに if (HandleCreated) を使用する必要がある場合は、今考えています。

どこで、いつ例外がスローされるかさえわかりません。

起動時、InitializeComponent(); の後、datagridview などのいくつかのコントロールへのアクセスを必要とするいくつかのタスクがあります。しかし、私が言ったように、私は InvokeRequired でそれらを保護しようとします。それが問題の原因であるかどうかはわかりません。

私が実行できる提案は何ですか?この問題を試してみてください。

とにかく、これは私の例外です:

    System.InvalidOperationException: Invoke or BeginInvoke cannot be called on a 

control until the window handle has been created.
   at System.Windows.Forms.Control.WaitForWaitHandle(WaitHandle waitHandle)
   at System.Windows.Forms.Control.MarshaledInvoke(Control caller, Delegate 

method, Object[] args, Boolean synchronous)
   at System.Windows.Forms.Control.Invoke(Delegate method, Object[] args)
   at System.Windows.Forms.Control.Invoke(Delegate method)
   at ..()
   at ..()
   at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, 

ContextCallback callback, Object state)
   at System.Threading.ThreadHelper.ThreadStart()
4

2 に答える 2

0

ここでトレースが完全に役立つかどうかはわかりません。ハンドルが作成される前に、コードのどこかで invoke/BeginInvoke を呼び出していることは明らかです。さて、私が提案していることには多少の作業が必要になるかもしれませんが、作成されていないハンドルを時期尚早に呼び出している呼び出し元を釘付けにするでしょう。私はこの手法を使用して、本番環境で古い C++ レガシー コードのロック/ロック解除スレッドの問題を追跡しようとしました。とてもうまくいったので、そのままにしておきました。

これが私のテクニックです。Invoke/BeginInvoke および EndInvoke をサポートするオブジェクトを受け入れる拡張クラスを作成します。次のようになります。

public static class MyInvokeExtension
{
   public static void TempInvoke(this objectthatsupportsinvoke, ...)
   {
        try
        {
           objectthatsupportsinvoke.Invoke(...);
        }
        catch(Exception ex)
        {
           Console.WriteLine();  // put a break-point here
        }
   }

   // add other BeginInvoke and EndInvoke methods and do the same as above.
}
  • ここで、コード全体を検索して置換し、すべての Invoke のような呼び出しを TempInvoke のような呼び出しに置き換えます。
  • アプリケーションをデバッグで実行します。
  • ある時点でブレークポイントにぶつかります。
  • コール スタック ウィンドウを使用して、呼び出しメソッドを必要以上に早く呼び出しているユーザーを見つけます。

これが大変な作業であることはわかっていますが、長い目で見ればそれだけの価値があります。信頼してください。実際、このコードを使用して、オブジェクトが特定の時点で呼び出しを処理できることを検証することもできます。

それがどうなるか教えてください。

于 2013-04-09T01:03:30.280 に答える