EventHandler调用异常:同代码本机失效同事机器正常的原因排查
我来帮你捋捋这种“同代码不同结果”的常见问题点,大概率是本地环境或者细节配置的差异:
事件订阅时机滞后:你是不是在
OnItemSelected已经触发之后,才给ItemSelectedOrDeselectedEvent绑定DoWorkMethod?比如如果订阅逻辑放在了某个延迟初始化的方法里(比如点击按钮后才绑定),而事件在页面加载时就触发了,那自然收不到回调。同事那边可能是在构造函数或者InitializeComponent()完成后立刻绑定了事件,时机卡对了。事件委托被意外覆盖/清空:虽然你用了
?.Invoke,但如果ItemSelectedOrDeselectedEvent在其他地方被重新赋值(比如写成ItemSelectedOrDeselectedEvent = null;或者绑定了新的委托却没保留原有订阅),那你的DoWorkMethod就会被挤掉。检查下项目里有没有其他地方修改这个事件字段的代码,同事的代码分支里可能没有这类误操作。本地编译缓存搞鬼:Visual Studio的旧缓存经常会导致“代码改了但运行的还是旧逻辑”的问题。试试先清理解决方案(菜单栏→生成→清理解决方案),然后删除项目根目录下的
bin和obj文件夹,最后重新生成整个解决方案。同事那边大概率是拉取代码后直接全新编译,没有缓存残留。订阅与触发的对象实例不匹配:你会不会是给对象A绑定了
DoWorkMethod,但实际触发OnItemSelected的是完全不同的对象B?比如在列表控件里,你绑错了列表项实例,或者单例对象的初始化逻辑在本地出了问题,导致生成了多个实例。这种情况可以在订阅和触发的地方分别打个断点,看看this的实例ID是不是同一个。隐藏的异常被吞掉:因为你用了
?.Invoke,如果事件触发时ItemSelectedEventArgs的构造或者DoWorkMethod内部抛出了异常,可能不会直接报错(取决于.NET版本和配置),但会导致回调执行失败。可以在OnItemSelected里加个try-catch块,或者开启VS的“抛出所有异常”调试选项(Ctrl+Alt+E),看看有没有隐藏的异常。
附上你提供的代码片段方便对照:
事件触发逻辑:
protected virtual void OnItemSelected() { ItemSelectedOrDeselectedEvent?.Invoke(this, new ItemSelectedEventArgs(this.FullPath, this.IsSelected, this.Type)); }订阅方法:
public void DoWorkMethod(object sender, ItemSelectedEventArgs args) { // Do work }
内容的提问来源于stack exchange,提问作者user12073914

