1

何らかの理由で、「InvalidOperationException:オブジェクトは現在他の場所で使用されています」というメッセージが表示されます。

以下のカスタムOnPaintの実行中(実際には、コードの行コピーのほぼ1行です...そこにはほとんどありません)。

以下の例外ハンドラーにログインして、UI以外のスレッドからOnPaintを呼び出しているかどうかを検出します...これはトリップされませんが、エラーがログに記録されます(以下のスタックトレースを参照)。

これらのエラーが発生しているマシンでは、他のコントロールからの恐ろしいRed Xの運命も見られます(おそらく、OnPaintsの周りにtry / catchがありません)。

それらはおそらく関連していますが、このコードがUIスレッドからのみ呼び出された場合、そのエラーの原因を特定することはできません。

何か案は?

これはスタックトレースです。

System.InvalidOperationException:オブジェクトは現在他の場所で使用されています。
System.Drawing.Graphics.CheckErrorStatus(Int32 status)
at System.Drawing.Graphics.DrawRectangle(Pen pen、Int32 x、Int32 y、Int32 width、Int32 height)
at System.Windows.Forms.ControlPaint.DrawBorderSimple(Graphics graphics、
System.Windows.Forms.ControlPaint.DrawBorder(グラフィックグラフィックス、長方形の境界、色の色、ButtonBorderStyleスタイル)の
MyUserControl.OnPaint(PaintEventArgs e)の長方形の境界、色の色、ButtonBorderStyleスタイル)

これはクラスです:

public class MyUserControl : UserControl
{
    // Override this to set your custom border color
    protected Color mBorderColor = SystemColors.ControlDarkDark;

    public MyeUserControl()
        : base()
    {
        this.BorderStyle = BorderStyle.None;
        this.Padding = new Padding(1);
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
        try
        {
            ControlPaint.DrawBorder(e.Graphics, this.ClientRectangle, mBorderColor, ButtonBorderStyle.Solid);
        }
        catch (Exception ex)
        {
            // check if we're not on the UI thread, and if not, log it
            // log exception
        }
    }
}
4

2 に答える 2

10

それで、私は少し前にこれを理解しました、しかしここに答えを置くのを忘れました。問題を抱えているすべての顧客には、FileOpenと呼ばれるAdobeプラグインをインストールしていたという共通点がありました。これにより、ユーザーは暗号化されたPDFを読むことができます。FileOpenが行っていたことが(おそらく暗号化されたPDFなどの画面キャプチャをブロックするために)WindowsのGDI +呼び出し(.Net OnPaintメソッドから呼び出される)中に例外をスローすることにより、アプリケーションに干渉していたことが判明しました。FileOpenを使用する際に、アプリケーションからのGDI +呼び出しをブロックしないように、アプリケーションをホワイトリストに登録しました。

これを理解するのがさらに難しいのは、FileOpenを使用して暗号化されたPDFを初めて表示した後にのみブロックが発生するため、インストールしても問題が発生しないことです。WindowsサービスのFileOpenBrokerを停止すると、問題も修正されます(おそらく、サービスがブロックを行っているのです)。

他の誰かが同じ問題を見つけた場合に備えて、これをここに投稿するだけです。これは、職場での私たちにとって大きな頭痛の種であり、理解するのに数週間かかりました。

更新:FileOpenBrokerと呼ばれるFileOpenのサービスを停止するという非常に簡単な回避策があります。これは、Windowsサービスのリストで、Windowsタスクマネージャーのプロセスとして見つけることができるはずです。プロセスが停止すると、GDI +を台無しにするために行っている処理がすべて停止し、次に暗号化されたPDFを開くまでプログラムを使用できるようになります。

しばらく経ちましたので、よく覚えていませんが、GDI+に設定されているロックを解除するために再起動が必要だった可能性があります。サービスを開始および停止するバッチファイルを作成したことを覚えています。これにより、FileOpen(そのコンピューターで使用されているためインストールされていると思われます)の使用を完全に無効にすることなくプログラムを使用できます。

同じ問題を抱えている他の誰かから連絡があったので、FileOpenは根本的な問題を修正していないようです-彼らは私たちの特定のアプリケーションをホワイトリストに登録することによってのみバンドエイドをかけています...公正​​な警告。

于 2012-05-31T13:57:22.297 に答える
1

このブログ投稿では、エラーメッセージについて説明しています。

http://msmvps.com/blogs/peterritchie/archive/2008/01/28/quot-object-is-currently-in-use-elsewhere-quot-error.aspx

あなたが投稿したコードとそれを一致させることはできませんが、そのフォームで他のグラフィック操作が行われていますか?

また、非UIスレッドがこのコードを正常に実行し、同時にUIスレッドが試行および失敗し、UIスレッドでエラーが発生することを想像できます。

于 2011-10-14T23:32:07.493 に答える