gpt4 book ai didi

c# - 我只能关闭一次窗体,在创建窗口句柄之前无法在控件上调用 InvalidOperation Exception Invoke 或 BeginInvoke

转载 作者:太空宇宙 更新时间:2023-11-03 16:48:39 30 4
gpt4 key购买 nike

嗨当用户选择菜单项时,我从我的主窗体打开这样的窗体。

private void commToolStripMenuItem_Click(object sender, EventArgs e)
{
Command_Form Command_Form1 = new Command_Form();
Command_Form1.ShowDialog();
// Command_Form1.Dispose(); this didn't help
}

在表格“Command_Form1”中当用户点击关闭按钮时,我这样关闭它

private void Close_button_Click(object sender, EventArgs e)
{
this.Close(); //I get the exception here
}

此过程一次正常,但在第二次关闭表单时(我希望这是一个完全不同的/新的表单实例)我在这篇文章的标题中得到了错误。这是调试窗口中的输出。

System.Windows.Forms.dll 中发生类型为“System.InvalidOperationException”的第一次机会异常

列出此错误的所有主题都在继续关于不尝试对尚未显示的表单执行任何操作,但是当我单击表单中的按钮时会发生这种情况。在我看来,如果我能够单击它的按钮,几乎可以确保表单已显示。

我发现列出此类错误的其他帖子继续进行有关进行线程安全调用的内容,因此我将其作为实验进行了尝试,但没有任何区别。

private void Close_button_Click(object sender, EventArgs e)
{
if (this.InvokeRequired)
{
CloseCallback d = new CloseCallback(Close_button_Click);
Invoke(d, new object[] { sender, e });
}
else
{
this.Close();

我的应用程序中有多个线程,但它们是由我使用的控件创建的,而不是由我明确创建的。我通过委托(delegate)[s]编码接收/发送的数据,将数据从串行端口传递到/从表单传递。串行端口运行在与表单不同的线程上是有道理的,但为什么单击表单上的按钮会与表单在不同的线程中运行????

整个线程的事情很困惑我如何找出哪些线程起源于何处以及在我未明确创建的线程中发生了什么?为什么我需要通过委托(delegate)调用窗体的关闭方法?哎呀,在这个线程安全的多线程环境中我能做些什么如果我不知道什么/在哪里/为什么/谁/何时创建线程,我怎么知道我正在做的事情是否不安全/安全?

最佳答案

我的猜测是您的 close() 调用不会抛出该异常,而是在 close() 之后发生的事情。您是否使用调试器进入代码以查看它何时触发?

至于何时需要调用...只有一个线程允许在 GUI 上进行更改和访问动态属性,称之为 GUI 线程。 GUI 线程负责更新布局、触发按钮等事件。如果您曾经从另一个线程访问 GUI(例如计时器事件),则需要使用 invoke() 将您的函数排队以在 GUI 线程上运行。 BeginInvoke 也会对函数进行排队,但它是异步的(只会对要在 GUI 线程上运行的函数进行排队,但不会等待它完成)。

Close_button_click 只会在按钮单击事件触发时由您的 gui 线程调用(除非您在代码后面的其他地方明确调用它,不推荐!),所以 invokeRequired=false 在您上面的代码中,调用代码是从未执行过。

关于c# - 我只能关闭一次窗体,在创建窗口句柄之前无法在控件上调用 InvalidOperation Exception Invoke 或 BeginInvoke,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4948087/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com