1

私はサードパーティのコントロール (ComponentOne) を使用していますが、断続的に、この典型的な画像が示すような典型的な赤い X ボックスが表示されます。最初は GDI リークがあると思ったので、いくつかの作業を行った後、コントロールを描画するときに GDI 番号が正常であることを確認しました。

ここに画像の説明を入力

グーグルで調べたところ、OnPaint() イベントでこの種のエラーが発生することがわかりました。そのため、コントロールを Render に呼び出すときに try and catch を実行しても、キャッチされません。

したがって、次のステップは、コードに次のオーバーライドを含めることです。

        protected override void OnPaint(PaintEventArgs e)
       {
           try
           {
               base.OnPaint(e);
           }
           catch (Exception ex)
           {
               this.Invalidate();  //attempt to redraw the control
               XmSam.Log(ex);
           }
       }

これでうまくいくと思いますが、この問題を常に再現できるわけではないため、上記のコードをまだ完全にテストできていません。私の質問は、コントロールをレンダリングして例外がある場合、このコードはコントロールを再描画しようとすることです。これは無限ループに陥り、UI がフリーズしますか? または、例外の原因が何であれなくなり、2 番目のコントロールが再描画され、正常にレンダリングされると思いますか?

4

2 に答える 2

0

過去にこれを見たときは、常にスレッドの問題に関係していました。UI スレッドとは別のスレッドからこのコントロールを更新していますか?

これに対処してからしばらく経ちましたが、最も簡単な方法は、BackGroundWorker クラスを使用してバックグラウンド操作を実行し、フォーム コントロールを更新することだと思います。

BackGroundWorker クラス

于 2013-07-29T14:55:22.483 に答える