C#等到事件监听器完成

时间:2011-03-22 14:03:44

标签: c# events

在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上的标签)。

4 个答案:

答案 0 :(得分:2)

你说:“问题是,'if(args.Cancel ....'行永远不会到达'

这告诉我连接到NameChanged的事件处理程序没有返回。另一种可能性是这些处理程序中的一个抛出了未处理的异常,并且您示例中的上述代码吞噬了异常。

-Oisin

答案 1 :(得分:1)

默认情况下,事件是同步的=您当前的代码应该有效。

您需要使用BeginInvoke使事件异步(您想要避免的事情)

答案 2 :(得分:1)

  

在所有事件监听器完成工作之前,我将如何暂停执行

暂停,直到所有处理程序都已执行,如果直接调用NameChanged,这是默认行为。尝试进入事件处理程序以查看正在发生的事情

答案 3 :(得分:0)

不致电if (args.Cancel) ..的唯一原因  我能想到的是,其中一个事件处理程序中存在未被捕获的异常。

注意我有时会遇到vs2008 / vs2010调试器的问题,它继续运行主应用程序,而不是停在事件调用之后。如果你设置一个断点,你可以检查一下 if (args.Cancel) ..