对象处置竞争条件

时间:2016-11-03 10:42:42

标签: c# multithreading

这个问题困扰了我一段时间,我想我现在理解了这个问题,但我无法弄清楚修复它的实现细节。

我有一个运行后台线程,它有一个函数,通过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类来改进线程同步,以便不能发生异常?

非常感谢如何修复上面破碎的代码的任何示例?

关心杰夫

0 个答案:

没有答案