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
相关产品推荐
相关产品推荐

