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

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

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

在出现这些错误的计算机上,我们还看到其他控件(可能没有对它们的OnPaint进行尝试/捕获)所带来的可怕的Red X厄运。

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

有任何想法吗?

这是堆栈跟踪:


  System.InvalidOperationException:当前正在使用对象
  别处。在System.Drawing.Graphics.CheckErrorStatus(Int32
  状态)在System.Drawing.Graphics.DrawRectangle(钢笔,Int32
  x,Int32 y,Int32宽度,Int32高度)在
  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
        }
    }
}

最佳答案

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

更难弄清楚的是,只有在您第一次使用FileOpen查看加密的PDF之后才会发生阻塞,因此您可以安装它而不会遇到问题。如果停止他们的Windows服务FileOpenBroker,它也可以解决该问题(大概是该服务正在执行阻止操作)。

只是将其发布在这里,以防其他人遇到相同的问题,因为这对于我们的工作来说是一个巨大的头痛,并且花费了数周的时间才弄清楚。

更新:
有一个非常简单的解决方法,即停止FileOpen的服务,该服务称为FileOpenBroker。您应该可以在Windows服务列表中找到它,也可以在Windows任务管理器中找到它。一旦该过程停止,它将停止他们为破坏GDI +所做的一切,然后您将可以使用该程序,直到下次打开加密的PDF。

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

我刚遇到其他遇到同样问题的人,所以FileOpen似乎并没有解决根本问题-他们只是通过将我们的特定应用列入白名单而对它进行了创可贴...公平的警告。

10-01 21:38