说我有2种方法。一种是由列表框中所选索引更改触发的方法。第二种方法有助于清除所有文本框,将列表框索引设置为-1,并设置焦点。
问题:
方法二执行,在代码中它将列表框的选定索引更改为-1,从而为第一个方法设置事件触发器。方法2是否暂停它自己的执行并将进程转移到事件,然后在方法1完成后返回其工作...或方法2完成其整个代码块然后转移到方法1,因为所选索引发生了变化? / p>
答案 0 :(得分:8)
第一种情况。
让我们暂时离开它,特别是因为它们没有涉及你的场景。
你在谈论属性和方法,但在它之下,它只是功能。当一个函数调用另一个函数时,程序中的控件将转移到被调用函数。当该函数完成运行时,控件将返回到调用它的位置。无论函数调用更多函数有多深,您的程序都会自动记住它需要返回的位置。*
当你的第二个函数设置索引时,真正发生的是编译器将属性集操作转换为函数调用。 (属性最终只是函数的“语法糖”。)该函数调用一堆对场景不重要的其他函数,除了其中一个是调用“索引已更改”事件处理程序的函数。它看到你有一个与该事件相关的方法,它会调用你的第一个方法。
您的第一个方法运行,当它完成时,它返回“调用索引更改的事件处理程序”函数。最终,那个和所有其他不重要的函数完成运行(可能在按顺序进行更多函数调用之后),“set the index property”函数将控制权返回到第二个方法。
您可以向自己证明您的第一个建议是如何运作。在第一种方法中显示一个消息框,并在第二种方法中设置索引属性后显示另一个消息框。 (使用不同的消息!)您应该看到第一条消息出现,在您关闭消息框后,您应该看到第二条消息出现,从而表明第二条方法在第一条消息运行时没有继续执行。
*
是一个限制,但除非您的程序中存在错误,否则很少会受到限制。当你有太多嵌套函数调用时,会发生什么是堆栈溢出。
答案 1 :(得分:1)
您可以探索第三种选择:他们也可以同时运行 !如果我正确理解您的问题,方法2将由索引更改事件触发。在C#Windows窗体应用程序中,此其他事件将在单独的执行线程中发生。
要探索的概念:线程化。
我希望这能为你的知识探索提供一个起点。
答案 2 :(得分:1)
假设没有多线程情况,该事件将在他执行该方法之前触发。如果您想看到这一点,请编写您在.NET语言中建议的内容并检查生成的Il。您可以使用ILDASM或Reflector执行此操作,甚至可以创建自己的relfletion应用程序。你必须完全理解IL的语法才能看到分支,但只要你理解编程概念就不那么困难了。
Rob已经标注了这种“语法糖”,我会在某种程度上同意这一点。它实际上是一个编译器技巧,但我猜它属于常用的“语法糖”标签。答案 3 :(得分:0)
我认为有问题的语言是c#,因此你有一种支持多线程的语言。如果您不想担心线程(如果您考虑用户体验这将是一个坏主意),您可以在一个线程中运行GUI并具有相同的行为,除非组件创建自己的线程(这将是一点点虽然很奇怪。如果要实现事件的异步(并行)执行,则需要在自己的线程中触发事件。
回答你的问题:如果你没有使用多个线程,那么事件触发的方法将排队。当你看到GUI在某些程序中响应缓慢时,就会发生这种情况。
希望它能解决问题并欢迎另一位新人:)
答案 4 :(得分:0)
我自己是初学者,也许我可以帮忙。方法2将触发,然后当选择发生变化时,Method1将完成他的工作,然后方法2将继续。
如果您当时不希望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;
}
它可能不是最佳的(也许是一些最佳实践......)但由于缺乏更好的解释,至少你有一些信息可以帮助你搜索。希望它有所帮助!