gpt4 book ai didi

c# - 事件一次只能发出一个调用吗?

转载 作者:行者123 更新时间:2023-11-30 13:51:32 25 4
gpt4 key购买 nike

假设我有一个这样的事件:

SomeClass.SomeEvent += MyMethodToCall();

...

public void MyMethodToCall()
{
if (CheckToSeeIfFormIsAlreadyShowing())
{
SomeForm someForm = new SomeForm();
someForm.ShowDialog();
}
else
{
DoSomeStuff();
}
}

如果用户与 SomeForm 的交互导致 SomeEvent 再次触发,那么在 someForm 仍在显示时是否会再次调用 MyMethodToCall?

我的证据似乎表明它不会。

我的问题是为什么?事件再次发生。为什么 MyMethodToCall 不会再次被调用(然后最终调用 DoSomeStuff()

我猜这是不可能的(仍然不确定为什么)。假设不可能,我可以在单独的线程 (begininvoke) 上显示对话框吗? (我似乎记得所有 UI 都需要在同一个线程上发生,所以我犹豫要不要尝试)。

如果该事件再次发生,我需要再次调用该事件(即使 SomeForm 对话框仍在显示。任何关于如何做到这一点的想法都很棒!

注意:这显然是一个人为的例子,我试图将我的复杂代码压缩成一个例子来演示我正在处理的真正问题。 (意思是请不要攻击我的例子。)

最佳答案

您的事件可以调用两次。

原因是,对 ShowDialog 的调用并没有真正阻塞线程。 ShowDialog 运行一个内部循环,从消息队列中抽取消息,以便仅在对话框关闭后返回。

这意味着,虽然 ShowDialog 尚未返回,但仍在您的 UI 线程上触发和处理 UI 事件。

因此,例如,如果您从某个 UI 事件的事件处理程序触发 SomeClass.SomeEvent 事件(例如,单击对话框上的按钮),则 SomeClass.SomeEvent 的事件处理程序被调用。

如果您中断调试器并查看堆栈跟踪,您将看到您的原始事件处理程序,调用 ShowDialog,调用消息泵,调用一些 UI 事件处理程序,第二次调用您的 SomeClass.SomeEvent 处理程序。

如果您的问题是事件没有被第二次调用,能否请您提供更多有关如何触发事件的详细信息?您是否尝试在调用您的事件的行上放置一个断点以确保它实际得到执行?

我希望这能回答您的问题。

关于c# - 事件一次只能发出一个调用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4329139/

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