You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET MVC 4.7.2事件触发后处理程序未及时执行,请求技术排查

问题分析与解决方案

看起来你这里的核心问题是事件绑定错了目标,同时可能对.NET同步事件的执行逻辑有点误解,咱们一步步理清楚:

1. 同步事件的默认行为

在.NET中,普通的同步事件(未使用异步委托的情况下)调用Invoke是阻塞式执行的:也就是说,当你调用RedirectDeleting?.Invoke(...)时,所有注册到这个事件的处理程序会被立即、同步地执行完毕,只有等所有处理程序都跑完,代码才会继续执行下一行的_redirectUrlService.Delete(id)。

你期望的“触发事件→执行处理程序→再执行Delete”完全符合.NET同步事件的默认逻辑,问题出在你的事件绑定环节。

2. 你的代码问题点

看你提供的处理类代码,你把处理方法RedirectsService_RedirectDeleted绑定到了RedirectDeleted事件上:

RedirectsService.RedirectDeleted += RedirectsService_RedirectDeleted;

但RedirectDeleted事件是在_redirectUrlService.Delete(id)执行之后才触发的,这就导致你的处理程序自然会在Delete之后运行,完全不符合预期。

3. 修正方案

你需要把处理方法绑定到RedirectDeleting事件上,这样当触发RedirectDeleting事件时,处理程序会同步执行,执行完成后才会进入Delete逻辑:

修正后的处理类代码:

// 绑定到RedirectDeleting事件,而非RedirectDeleted
RedirectsService.RedirectDeleting += RedirectsService_RedirectDeleting;

// 方法名可以更贴合事件语义,逻辑不变即可
private void RedirectsService_RedirectDeleting(object sender, RedirectDeletingArgs e)
{
    RemoveRedirectFromStorage(e);
}

4. 额外排查点(如果修正后仍有问题)

如果你确认已经绑定了正确的事件,但还是出现“触发类代码继续执行”的情况,检查两个细节:

  • 你的RemoveRedirectFromStorage方法内部是否偷偷使用了异步操作(比如async void)?如果是,会导致事件调用时不等待异步操作完成就继续执行后续代码,但你说未使用异步,这个可能性可以排除。
  • 是否有多个处理程序注册到RedirectDeleting事件,其中某个抛出了未捕获的异常?如果有,后续处理程序不会执行,但触发类的代码也会中断,这和你描述的情况不符,也可以排除。

总结来说,最可能的原因就是事件绑定错了,调整绑定的事件即可解决问题。

内容的提问来源于stack exchange,提问作者Ismail

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 17:57:52