C# &引用;InvalidOperationException:对象当前正在其他地方使用”;在无害的油漆上?

C# &引用;InvalidOperationException:对象当前正在其他地方使用”;在无害的油漆上?,c#,paint,invalidoperationexception,C#,Paint,Invalidoperationexception,出于某种原因,我们得到了“InvalidOperationException:对象当前正在其他地方使用” 在下面的自定义OnPaint过程中(实际上,这几乎是代码的逐行拷贝……这里有一点) 我们在下面的异常处理程序中进行了登录,以检测我们是否以某种方式从非UI线程调用OnPaint。。。这并没有被绊倒,但我们正在记录错误(见下面的堆栈跟踪) 在出现这些错误的机器上,我们还看到了来自其他控件的可怕的红色末日X(它们大概没有尝试过) 它们可能是相关的,但如果只从UI线程调用此代码,我无法找出导致该错

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

在下面的自定义OnPaint过程中(实际上,这几乎是代码的逐行拷贝……这里有一点)

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

在出现这些错误的机器上,我们还看到了来自其他控件的可怕的红色末日X(它们大概没有尝试过)

它们可能是相关的,但如果只从UI线程调用此代码,我无法找出导致该错误的原因

有什么想法吗

这是堆栈跟踪:

System.InvalidOperationException:对象当前正在使用 其他地方。
在系统、绘图、图形、检查错误状态(Int32 状态)
位于System.Drawing.Graphics.DrawRectangle(钢笔,Int32 x、 Int32 y,Int32宽度,Int32高度)
System.Windows.Forms.ControlPaint.DrawBorderSimple(图形、, 矩形边框、颜色、按钮顺序样式)位于 System.Windows.Forms.ControlPaint.DrawBorder(图形、, 矩形边框、颜色、按钮顺序样式)位于 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
        }
    }
}

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

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


我还可以想象一个非UI线程成功地执行此代码,同时UI线程尝试并失败,导致UI线程出现错误。

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

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


我还可以想象一个非UI线程成功地执行了这段代码,同时UI线程尝试并失败,导致UI线程出现错误。

所以,我在一段时间前就发现了这一点,但忘了在这里给出答案。所有遇到这个问题的客户都有一个共同点——他们安装了一个名为FileOpen的adobe插件。它允许用户读取加密的PDF。事实证明FileOpen所做的事情(可能是为了阻止加密PDF的屏幕截图或其他事情)干扰了我们的应用程序,在windows GDI+调用(从.Net OnPaint方法调用)期间引发异常。在使用FileOpen时,他们将我们的应用程序列为白名单,这样他们就不会阻止来自我们应用程序的GDI+调用

更难理解的是,只有在您第一次使用FileOpen查看加密PDF后,才会发生阻止。。。因此,您可以安装它,而不会遇到问题。如果您停止他们的windows服务FileOpenBroker,它也会修复问题(可能是该服务正在执行阻塞)

如果其他人看到同样的问题,就把它贴在这里,因为这对我们的工作来说是一个巨大的头痛问题,并且花了数周的时间才弄清楚

更新: 有一个非常简单的解决方法,就是停止FileOpen的服务,这就是FileOpenBroker。您应该能够在windows服务列表中找到它,并将其作为windows任务管理器中的进程。一旦进程停止,它就会停止任何他们正在做的破坏GDI+,然后你应该能够使用你的程序,直到下次你打开加密的PDF

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


P>我刚刚接触到其他人碰到这个问题,所以看起来FielOnt还没有解决根本问题-他们只把一个创可贴,通过白化我们的特定应用程序…很好的警告。

所以,我不久前就知道了,但忘了在这里写答案。所有遇到这个问题的客户都有一个共同点——他们安装了一个名为FileOpen的adobe插件。它允许用户读取加密的PDF。事实证明FileOpen所做的事情(可能是为了阻止加密PDF的屏幕截图或其他事情)干扰了我们的应用程序,在windows GDI+调用(从.Net OnPaint方法调用)期间引发异常。在使用FileOpen时,他们将我们的应用程序列为白名单,这样他们就不会阻止来自我们应用程序的GDI+调用

更难理解的是,只有在您第一次使用FileOpen查看加密PDF后,才会发生阻止。。。因此,您可以安装它,而不会遇到问题。如果您停止他们的windows服务FileOpenBroker,它也会修复问题(可能是该服务正在执行阻塞)

如果其他人看到同样的问题,就把它贴在这里,因为这对我们的工作来说是一个巨大的头痛问题,并且花了数周的时间才弄清楚

更新: 有一个非常简单的解决方法,就是停止FileOpen的服务,这就是FileOpenBroker。您应该能够在windows服务列表中找到它,并将其作为windows任务管理器中的进程。一旦进程停止,它就会停止任何他们正在做的破坏GDI+,然后你应该能够使用你的程序,直到下次你打开加密的PDF

已经有一段时间了,所以我记不清了,但可能需要重新启动才能释放他们在GD中设置的任何锁