调用引发InvalidOperationException

时间:2018-09-07 18:45:06

标签: c# delegates invoke

我遇到了一个困扰的问题,希望有人能对此有所了解。我有一个名为Form的{​​{1}},并且我正在运行一些代码,以使用form2将某些项目添加到该表单的Listview(s)中,以便UI线程在我这样做。

第一次运行一切都很好,但是当我关闭该表单(上面有Listview的表单)并再次运行我的代码时, MethodInvoker

因此,我对此进行了调查,并在StackOverflow上进行了更多搜索,发现该问题是由于表单没有为其创建句柄而引起的,因为该表单在第一次关闭时就被丢弃了。 因此,我的解决方案是使它强制表单通过InvalidOperationException: Invoke or BeginInvoke cannot be called on a control until the window handle has been created为其自身设置一个句柄。即使使用了此功能,在我从异常中断处检查它时,窗体仍未设置该句柄。它有CreateControl()或类似名称,但我仍然得到我的00x0000000。我也尝试过检查InvalidOperationException并在此之后尝试使用.isDisposed(),但是没有运气。你们有没有听说过? SO上的其他线程对我来说没有解决办法。

我的代码:

CreateControl()

1 个答案:

答案 0 :(得分:0)

因此,由于没有人对此做出回应,因此我将回答我自己的问题,以防有人遇到此问题并为他们提供帮助。实际上,我最终将其置于创建的新线程的范围之外,并在按钮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.");
    }