C#等待事件侦听器完成

C#等待事件侦听器完成,c#,events,C#,Events,在C#winforms程序中,当有人试图重命名项目时,我会触发一个事件。在该事件的EventArgs中,我有一个“Cancel”属性,事件侦听器可以将该属性设置为true(理想情况下)以取消重命名(例如,如果名称已在使用中): 问题是,从未到达“if(args.Cancel…”行。我猜,在触发事件之后,执行仍在继续,因此args.Cancel始终为false,因此重命名总是发生。如何使执行停止,直到所有事件侦听器完成其工作(给args.Cancel一个设置为true的机会) 我假设这是可能的,因

在C#winforms程序中,当有人试图重命名项目时,我会触发一个事件。在该事件的EventArgs中,我有一个“Cancel”属性,事件侦听器可以将该属性设置为true(理想情况下)以取消重命名(例如,如果名称已在使用中):

问题是,从未到达“if(args.Cancel…”行。我猜,在触发事件之后,执行仍在继续,因此args.Cancel始终为false,因此重命名总是发生。如何使执行停止,直到所有事件侦听器完成其工作(给args.Cancel一个设置为true的机会)


我假设这是可能的,因为许多windows窗体EventArg都有一个Cancel属性,允许刚刚取消的内容(例如更改TreeView的TreeNode上的标签)。

默认情况下事件是同步的=当前代码应该可以工作

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

在所有事件侦听器完成其工作之前,如何使执行停止

在所有处理程序都执行之前,它会停止。如果直接调用
NameChanged
,则这是默认行为。尝试进入事件处理程序查看发生了什么情况您会说:“问题是,从未到达“if(args.Cancel…”行”

这告诉我连接到NameChanged的事件处理程序没有返回。另一种可能是这些处理程序中的一个正在抛出未处理的异常,而示例中的上述代码正在吞咽该异常


-Oisin是不调用if(args.Cancel)的唯一原因 我能想到的是,在一个EventHandler中有一个未捕获的异常

注意:vs2008/vs2010调试器会继续主应用程序的操作,而不是在事件调用后停止,我有时会遇到问题。如果在
if(args.Cancel)..

您对
NameChanged
的调用是同步和阻塞的。因此,这不是您的问题。作为旁注:您的
null
检查不是线程安全的,即从另一个线程订阅也不安全。但是,由于您很可能不从另一个线程订阅,因此在实践中这不是问题。仍然建议您首先将事件委托存储在局部变量中,检查该变量是否为null,然后调用该变量。确定,则必须是其他变量。是否确定订阅服务器在调用事件之前已开始订阅?x0n是正确的,事件处理程序中引发了异常。所有订阅都正确。
ProjectRenamedEventArgs args = new ProjectRenamedEventArgs(oldName, newName);

if (NameChanged != null)
    NameChanged(this, args);

if (args.Cancel)
{
    // Cancel
}
else
{
    // Continue
}