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