gile 发表于 2020-4-2 22:57:23

我认为随着更多的背景,它现在变得越来越清晰。
我想你的意思是说“DocumentBecameCurrent事件
处理程序
从释放的表单触发”
引用的语句的问题在于DocumentBecameCurrent事件不是“来自”表单,而是被调度到“表单”,如果表单被释放,它应该在null事件处理程序方法上引发异常(但在这种情况下崩溃)。
同样,“事件调度程序”保持活动状态,“事件处理程序”与释放的表单一起运行。
同样,将事件处理程序替换为调度程序...
给定,注册到“调度程序”的事件“处理程序”由拥有事件处理程序方法的表单的句柄引用,但在释放时,表单在静态变量中变为 null。
没错,在包含变量的类变为 null 之前,变量不能超出范围,但是当该变量引用的表单变为 null(已释放)时,变量可能会变为 null。
基本上,文档正在将事件消息分派/发送到不再存在的表单。每个需要知道何时触发事件的“对象”都需要向在更高级别处理事件的对象(事件调度程序)注册自己的回调(事件处理程序)。正如 Daniel 所展示的,您可以对想要在事件发生时处理事件的对象执行此操作,但您必须在对象超出范围(释放)时取消注册它,以避免本主题的问题。
或者,您可以按照我的方式执行此操作,只需调用存储在静态变量上的任何对象,无论哪种方式,您都可以捕获事件并间接处理它。
也许是语义,但我认为这个问题现在更清楚了,希望能帮助将来遇到类似问题
的人

Keith™ 发表于 2020-4-3 20:58:28

好的,是的,你是对的,处理程序是以被处置的形式,它是从其他地方提出的。显然不是形式。
无论如何,我已将处理程序移到窗体之外,并将其放入应用程序的静态类中。只要应用程序处于活动状态,处理程序就不会崩溃,因为我在调用所述对象中定义的公共函数之前检查了实际上是否存在空对象。
它有效,这是一个胜利!
页: 1 [2]
查看完整版本: 由于未引用对象而导致的 Autocad 崩溃