1

出于某种原因,我们收到“InvalidOperationException:对象当前正在其他地方使用”。

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

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

在我们遇到这些错误的机器上,我们还看到了来自其他控件的可怕的红色 X(可能在他们的 OnPaints 周围没有尝试/捕捉)。

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

有任何想法吗?

这是堆栈跟踪:

System.InvalidOperationException:对象当前正在其他地方使用。
在 System.Drawing.Graphics.CheckErrorStatus(Int32 状态)
在 System.Drawing.Graphics.DrawRectangle(Pen pen, Int32 x, Int32 y, Int32 width, Int32 height)
在 System.Windows.Forms.ControlPaint.DrawBorderSimple(图形图形,
System.Windows.Forms.ControlPaint.DrawBorder(Graphics graphics, Rectangle bounds, Color color, ButtonBorderStyle style) at
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,它也可以解决问题(可能是该服务正在阻止)。

把这个贴在这里,以防其他人看到同样的问题,因为这对我们工作来说是一个非常头疼的问题,并且需要数周时间才能弄清楚。

更新:有一个非常简单的解决方法,即停止 FileOpen 的服务,称为 FileOpenBroker。您应该能够在 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 回答