3

说我有两种方法。一种是由列表框中所选索引更改触发的方法。第二种方法有助于清除所有文本框、将列表框索引设置为 -1 并设置焦点。

问题:

方法二执行时,在代码中将列表框的选定索引更改为-1,从而触发第一种方法的事件触发器。方法 2 是否暂停它自己的执行并将进程转移到事件,然后在方法 1 完成后返回到它的工作......或者方法 2 是否完成其整个代码块然后转移到方法 1,因为所选索引发生了变化?

4

5 回答 5

8

第一种情况。

让我们暂时搁置线程,特别是因为它们不涉及您的场景。

你在谈论属性和方法,但在这一切之下,它都只是函数。当一个函数调用另一个函数时,程序中的控制权转移到被调用函数。当该函数完成运行时,控制返回到调用它的位置。无论函数调用更多函数的深度如何,您的程序都会自动记住它需要返回的位置。*

当您的第二个函数设置索引时,真正发生的是编译器将属性设置操作转换为函数调用。(属性最终只是函数的“语法糖”。)该函数调用了一堆对场景不重要的其他函数,除了其中一个是调用“索引更改”事件处理程序的函数。它看到您有一个与该事件关联的方法,并调用您的第一个方法。

您的第一个方法运行,当它完成时,它返回到“调用索引更改事件处理程序”函数。最终,该函数和所有其他不重要的函数完成运行(可能在按顺序进行更多函数调用之后),并且“设置索引属性”函数将控制权返回给您的第二个方法。

您可以向自己证明您的第一个建议是它的工作原理。在您的第一个方法中显示一个消息框,并在您设置 index 属性的第二种方法中的点之后显示另一个消息框。(使用不同的消息!)您应该看到第一条消息出现,在您关闭消息框后,您应该看到第二条消息出现,从而表明第二个方法在第一个方法运行时没有继续执行。

*有一个限制,但除非您的程序中存在错误,否则它很少会被击中当你有太多的嵌套函数调用时,会发生堆栈溢出

于 2009-02-20T01:53:12.467 回答
1

您可以探索第三种选择:它们也可以同时运行!如果我正确理解您的问题,方法 2 将由索引更改事件触发。在 C# Windows 窗体应用程序中,此其他事件将在单独的执行线程中发生。

探索的概念:线程。

我希望这能为您探索知识提供一个起点。

于 2009-02-20T01:16:28.250 回答
1

假设没有多线程情况,事件将在方法执行结束之前触发。如果您想看到这一点,请使用 .NET 语言对您建议的内容进行编码并检查生成的 Il。您可以使用 ILDASM 或 Reflector 完成此操作,甚至可以创建自己的 relfletion 应用程序。您确实必须足够了解 IL 的语法才能看到分支,但这并不难,只要您了解编程概念即可。

Rob 已将其标记为“语法糖”,我对此表示同意。这确实是一个编译器技巧,但我想它属于常用的“语法糖”标签。

于 2009-02-20T02:47:10.653 回答
0

我假设有问题的语言是 c#,因此你有一种支持多线程的语言。如果您不想担心线程(如果考虑到用户体验,这将是一个坏主意),您可以在一个线程中运行您的 GUI 并具有相同的行为,除非组件创建自己的线程(这会有点虽然很奇怪)。如果要实现事件的异步(并行)执行,则需要让事件在其自己的线程中触发。

回答您的问题:如果您不使用多个线程,则事件触发的方法将排队。当您在某些程序中看到 GUI 响应缓慢时,就会发生这种情况。

希望它能解决问题并欢迎另一个新人:)

于 2009-02-20T01:15:55.737 回答
0

我自己是初学者,也许我可以提供帮助。Method2会开火,然后选择选择时,方法1会做他的事情,然后Method2将继续。

如果您当时不希望 Method1 触发,您可能想要执行以下操作:(真正的伪代码)

Method2(object sender, System.EventArgs e)
{
  //Unsubscribe Method1 from ListboxEvent
  Listbox.OnSelectionChange -= Method1;

  ... Stuff Method2 actually does ...

  Manualy call Method1 if you want it to fire

  //Subscribe Method1 from ListboxEvent
  Listbox.OnSelectionChange += Method1;
}

它可能不是最佳的(也许是一些最佳实践......)但由于缺乏更好的解释,至少您有一些信息可以帮助您搜索。希望能帮助到你!

于 2009-02-20T01:43:16.967 回答