调用抛出 InvalidOperationException

Invoke throwing InvalidOperationException

我遇到了一个难以解决的问题,我希望有人能对此有所启发。我有一个名为 form2Form,我正在 运行 编写一些代码,使用 MethodInvoker 向该表单的 Listview(s) 添加一些项目,以便UI 线程在我这样做时保持响应。

第一次 运行 一切都很好,但是 当我关闭那个表单(上面有 Listview 的表单)和 运行 我的代码再次 我得到一个 InvalidOperationException: Invoke or BeginInvoke cannot be called on a control until the window handle has been created.

所以我对此进行了调查,并在谷歌上进行了更多搜索,并在 Whosebug 上进行了查看,我发现问题是由于表单没有为其创建句柄引起的,因为它在第一次关闭时被处理掉. 所以我的解决方案是让它通过 CreateControl() 强制表单为自己设置一个句柄。即使在使用它之后,当我在异常中断中检查它时,我的表单仍然没有设置句柄。它有 00x0000000 或类似的东西,我仍然得到我的 InvalidOperationException。我也尝试过检查 .isDisposed() 并尝试在那之后使用 CreateControl() 但没有成功。你们以前听说过这个吗? SO 上的其他线程没有为我提供解决方案。

我的代码:

            if (!form2.IsHandleCreated)
            {          
             form2.CreateControl();
            }


            form2.Invoke((MethodInvoker) delegate
            {
             //Do Stuff Here.
            }

因此,由于没有人对此做出回应,我会回答我自己的问题,以防万一有人遇到这个问题,这对他们有帮助。实际上,我最终将其置于我创建的新线程的范围之外,并在按钮 click 事件中创建了表单。然后我检查我的表单是否 Disposed 或仍然打开并基于此创建表单的新实例。

这是我的代码:

    var checkDMS = CheckIfNull(dealtxt.Text);
    if (checkDMS)
    {
        //If DMS Deal is valid -> If Form is Closed -> 
        if (form2.IsDisposed)
        {
            // If Form not open -> Create new instance 
            form2 = new Form2();
            form2.Show();
            form2.SendToBack();
        }
        else
        {
            // If Form still open -> Close and make new instance.
            form2.Close();
            form2 = new Form2();
            form2.Show();
            form2.SendToBack();
        }

        runDMSQueryFromNewThread(materialCheckBox1.Checked);
    }
    else
    {
        MessageBox.Show("Cannot Pull Deal From DMS.");
    }