在C#winforms程序中,当有人试图重命名项目时,我会触发一个事件。在该事件的EventArgs中,我有一个“取消”属性,事件侦听器可以设置为true(理想情况下)取消重命名(例如,如果名称已在使用中):
ProjectRenamedEventArgs args = new ProjectRenamedEventArgs(oldName, newName);
if (NameChanged != null)
NameChanged(this, args);
if (args.Cancel)
{
// Cancel
}
else
{
// Continue
}
问题是,“if(args.Cancel ....”行永远不会到达。我猜测在事件被触发后执行仍在继续,因此args.Cancel总是为false所以重命名总是发生。在所有事件监听器完成工作之前,我将如何暂停执行(给args.Cancel一个机会设置为true)。
我假设这是可能的,因为许多窗口形式EventArgs都有一个Cancel属性,允许任何刚刚被取消的东西(例如,更改TreeView的TreeNode上的标签)。
答案 0 :(得分:2)
你说:“问题是,'if(args.Cancel ....'行永远不会到达'
这告诉我连接到NameChanged的事件处理程序没有返回。另一种可能性是这些处理程序中的一个抛出了未处理的异常,并且您示例中的上述代码吞噬了异常。
-Oisin
答案 1 :(得分:1)
默认情况下,事件是同步的=您当前的代码应该有效。
您需要使用BeginInvoke
使事件异步(您想要避免的事情)
答案 2 :(得分:1)
在所有事件监听器完成工作之前,我将如何暂停执行
暂停,直到所有处理程序都已执行,如果直接调用NameChanged
,这是默认行为。尝试进入事件处理程序以查看正在发生的事情
答案 3 :(得分:0)
不致电if (args.Cancel) ..
的唯一原因
我能想到的是,其中一个事件处理程序中存在未被捕获的异常。
注意我有时会遇到vs2008 / vs2010调试器的问题,它继续运行主应用程序,而不是停在事件调用之后。如果你设置一个断点,你可以检查一下
if (args.Cancel) ..