由于某种原因,我们收到“ 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似乎并没有解决根本问题-他们只是通过将我们的特定应用列入白名单而对它进行了创可贴...公平的警告。