"InvalidOperationException:Object目前正在其他地方使用"在无害的onpaint期间?

Nat*_*nch 1 c# paint invalidoperationexception

出于某种原因,我们得到"InvalidOperationException:Object目前正在其他地方使用."

在我们的自定义OnPaint中,下面(实际上几乎是一行代码的行副本......那里有那么少).

我们已经登录下面的异常处理程序来检测我们是否以某种方式从非UI线程调用OnPaint ......并且没有被触发,但我们记录了该错误(请参阅下面的堆栈跟踪).

在我们遇到这些错误的机器上,我们也看到了来自其他控件的可怕的Red X ofom(可能在他们的OnPaints周围没有try/catch).

它们可能是相关的,但如果仅从UI线程调用此代码,我无法弄清楚可能导致该错误的原因.

有任何想法吗?

这是堆栈跟踪:

System.InvalidOperationException:Object目前正在其他地方使用.
在 System.Windows.Fornd.DtrolBorderSimple的
System.Drawing.Graphics.DrawRectangle(Pen pen,Int32 x,Int32 y,Int32 width,Int32 height)的System.Drawing.Graphics.CheckErrorStatus(Int32 status)处
(图形图形,矩形范围,Colour彩色,ButtonBorderStyle风格)
在System.Windows.Forms.ControlPaint.DrawBorder(图形图像,矩形范围,Colour彩色,ButtonBorderStyle风格)
在MyUserControl.OnPaint(PaintEventArgs的E)

这是班级:

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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Nat*_*nch 10

所以,我不久前想到了这一点,但忘了把答案放在这里.所有遇到此问题的客户都有一个共同点 - 他们安装了一个名为FileOpen的adobe插件.它允许用户读取加密的PDF.事实证明FileOpen正在做的事情(可能是阻止加密的PDF或其他东西的屏幕截图)通过在Windows GDI +调用期间抛出异常(从.Net OnPaint方法调用)来干扰我们的应用程序.在使用FileOpen时,他们将我们的应用程序列入白名单,以便它们不会阻止来自我们应用程序的GDI +调用.

更让人难以理解的是,阻止只发生在第一次使用FileOpen查看加密的PDF之后......所以你可以安装它而不会遇到问题.如果你停止他们的Windows服务FileOpenBroker,它也解决了问题(可能是服务正在阻止).

只是在这里张贴这个以防其他人看到同样的问题,因为这对我们工作来说是一个巨大的头痛,并花了几周才弄明白.

更新:有一个非常简单的解决方法,即停止FileOpen的服务,称为FileOpenBroker.您应该能够在Windows服务列表中找到它,并作为Windows任务管理器中的进程.一旦该过程停止,它就会停止他们正在做的任何事情以搞砸GDI +,然后您应该能够使用您的程序,直到您下次打开加密的PDF.

它已经有一段时间了,所以我不记得了,但是有可能需要重新启动以释放它们放入GDI +中的任何锁.我记得我构建了一个批处理文件来启动和停止服务,这样你就可以使用你的程序而不会完全禁用使用FileOpen的功能(因为它在那台计算机上使用,我认为已经安装了FileOpen).

我刚刚遇到其他人遇到同样的问题,所以似乎FileOpen没有解决根本问题 - 他们只是通过将我们特定的应用程序列入白名单来提供创可贴......公平警告.