Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 调用引发InvalidOperationException_C#_Delegates_Invoke - Fatal编程技术网

C# 调用引发InvalidOperationException

C# 调用引发InvalidOperationException,c#,delegates,invoke,C#,Delegates,Invoke,我遇到了一个棘手的问题,我希望有人能解释一下。我有一个名为form2的表单,我正在运行一些代码,使用MethodInvoker将一些项目添加到该表单的Listview,以便UI线程在我这样做时保持响应 第一次使用它时一切都正常,但是当我关闭该窗体(上面有Listview的窗体)并再次运行代码时,我得到一个无效操作异常:在创建窗口句柄之前,不能对控件调用Invoke或BeginInvoke 所以我研究了一下这个问题,在谷歌上搜索了一下,也搜索了一下StackOverflow,我发现这个问题是由于表

我遇到了一个棘手的问题,我希望有人能解释一下。我有一个名为
form2
表单,我正在运行一些代码,使用
MethodInvoker
将一些项目添加到该表单的
Listview
,以便UI线程在我这样做时保持响应

第一次使用它时一切都正常,但是当我关闭该窗体(上面有Listview的窗体)并再次运行代码时,我得到一个
无效操作异常:在创建窗口句柄之前,不能对控件调用Invoke或BeginInvoke

所以我研究了一下这个问题,在谷歌上搜索了一下,也搜索了一下StackOverflow,我发现这个问题是由于表单没有为它创建句柄造成的,因为它是在第一次关闭时被处理的。 因此,我的解决方案是让它通过
CreateControl()
强制表单为自己设置句柄。即使使用了这个,当我在异常中断中检查它时,我的表单仍然没有设置句柄。它有
00x0000000
或者类似的东西,我仍然得到我的
invalidooperationexception
。我还试着检查了
.isDisposed()
,并尝试在那之后使用
CreateControl()
,但没有成功。你们有谁听说过这个吗?其他线程对我来说没有解决方案

我的代码:

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


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

既然没有人回答这个问题,我会回答我自己的问题,以防有人遇到这个问题,这对他们有帮助。实际上,我最终把它放在了创建的新线程的范围之外,并在按钮
单击
事件中创建了表单。然后我检查我的表单是否已被处置
,或者仍然处于打开状态,并基于此创建了新的表单实例

这是我的代码:

    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.");
    }