为什么VS2012和VS2013之间的InvokeRequired属性值不同?

时间:2016-11-10 04:44:40

标签: c# winforms visual-studio-2012 visual-studio-2013

我正在为我的控件开发UI自动化。以下代码在VS2012中正常工作。

MyControl.PointToClient(p);

但是这段代码在VS2013中无效。它引发了以下异常 enter image description here

我也使用下面的代码来调用控件

public new Point PointToClient(Point p)
{
   if (MyControl.InvokeRequired)
   {
       pointToClientCallBack ptcb = new pointToClientCallBack(PointToClient);
       GetWindow().Invoke(ptcb, new object[] { p });
   }
   return MyControl.PointToClient(p);
}
delegate Point pointToClientCallBack(Point p);

在我调用我的控件后,InvokeRequired属性为true。

那么,请你建议我解决这个问题的正确方法。

谢谢,

1 个答案:

答案 0 :(得分:1)

  

VS2012和VS2013之间有什么不同?

我不确定,但我确实知道你return之后没有Invoke所以之后它会从工作线程调用return MyControl.PointToClient(p);

变化:

public new Point PointToClient(Point p)
{
   if (MyControl.InvokeRequired)
   {
       pointToClientCallBack ptcb = new pointToClientCallBack(PointToClient);
       GetWindow().Invoke(ptcb, new object[] { p });
   }
   return MyControl.PointToClient(p);
}

...为:

public new Point PointToClient(Point p)
{
   if (MyControl.InvokeRequired)
   {
       pointToClientCallBack ptcb = new pointToClientCallBack(PointToClient);
       return GetWindow().Invoke(ptcb, new object[] { p }) as Point;
   }
   return MyControl.PointToClient(p);
}

请注意,我们需要将从Invoke返回的对象转换为Point以匹配您的方法签名。

此外,您可能应该使用BeginInvoke而不是Invoke,因为后者会导致死锁