这个问题困扰了我一段时间,我想我现在理解了这个问题,但我无法弄清楚修复它的实现细节。
我有一个运行后台线程,它有一个函数,通过Invoke()调用代码重复获取datagridview单元格内容。当用户单击表单关闭时,会发生此问题。我得到一个"对象处理异常"当试图访问该表单上的datagridview时。这是有道理的,所以我添加了一行,如果控件已被处理,则不调用Invoke。 然而,这个解决方案不起作用。必须发生的是我有一个竞争条件,我检查处置标志是假的,但在那个确切的点,主gui线程运行并关闭表格并处置DGV。
public delegate object dlgMethod(Control ctrl, string methodName, object param1, object param2, object param3, object param4);
public object method(Control ctrl, string methodName, object param1 = null, object param2 = null, object param3 = null, object param4 = null)
{
object retVal = null;
if (ctrl.InvokeRequired)
{
if (!ctrl.IsDisposed)
retVal = ctrl.Invoke(new dlgMethod(method), new object[] { ctrl, methodName, param1, param2, param3, param4 });
return retVal;
}
else
{ // code snipped
我猜有两种方法可以解决这个问题?
1)我可以尝试使用ctrl.isDisposed测试和Invoke原子,也许有一种方法可以用lambda调用来做到这一点,但我无法弄清楚语法?
或2) 使用EventWaitHandler类来改进线程同步,以便不能发生异常?
非常感谢如何修复上面破碎的代码的任何示例?
关心杰夫