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

时间:2011-10-14 19:50:52

标签: c# paint invalidoperationexception

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

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

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

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

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

有什么想法吗?

这是堆栈跟踪:

  

System.InvalidOperationException:当前正在使用Object   其他。
在System.Drawing.Graphics.CheckErrorStatus(Int32   状态)
在System.Drawing.Graphics.DrawRectangle(Pen pen,Int32   x,Int32 y,Int32宽度,Int32高度)
at   System.Windows.Forms.ControlPaint.DrawBorderSimple(图形图形,   矩形边界,颜色,ButtonBorderStyle样式)   System.Windows.Forms.ControlPaint.DrawBorder(图形图形,   矩形边界,颜色,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
        }
    }
}

2 个答案:

答案 0 :(得分: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还没有解决根本问题 - 他们只是通过将我们的特定应用程序列入白名单来提供创可贴......公平警告。

答案 1 :(得分:1)

此博客文章解释了错误消息:

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

我无法将其与您发布的代码相匹配,该表单上是否还有其他图形操作?

此外,我可以想象一个非UI线程成功执行此代码,同时UI线程尝试和失败,导致UI线程上发生错误。