加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – NullReferenceException,在挂钩SetConsoleCtrlHandler时没

发布时间:2020-12-15 08:33:56 所属栏目:百科 来源:网络整理
导读:使用代码从 this thread挂钩控制台关闭事件,我有时会得到一个没有堆栈跟踪的NullReferenceException(大多数情况下我没有).它发生在发布和调试中,并且“抛出异常时中断”没有帮助(它中断,但堆栈跟踪仍为空).当我正常退出应用程序时,我从未得到此异常(这是命中
使用代码从 this thread挂钩控制台关闭事件,我有时会得到一个没有堆栈跟踪的NullReferenceException(大多数情况下我没有).它发生在发布和调试中,并且“抛出异常时中断”没有帮助(它中断,但堆栈跟踪仍为空).当我正常退出应用程序时,我从未得到此异常(这是命中输入并因此释放Console.ReadLine).应用程序事件日志有2个条目:

Application: MyApp.exe Framework Version: v4.0.30319 Description:
The process was terminated due to an unhandled exception. Exception
Info: System.NullReferenceException Stack:

和:

Faulting application name: Gateway.exe,version: 1.0.0.0,time stamp:
0x4e284101 Faulting module name: unknown,version: 0.0.0.0,time
stamp: 0x00000000 Exception code: 0xc0000005 Fault offset: 0x004d41ce
Faulting process id: 0xf00 Faulting application start time:
0x01cc47b827e19a6e Faulting application path:
C:devMyApp.exe Faulting module path:
unknown Report Id: 689c1caa-b3ab-11e0-ba1b-00247e777f12

Google已经通过SetConsoleCtrlHandler透露了一些bugs和issues,所以我想知道这是否是一场失败的战斗.

解决方法

像这样的代码最典型的问题是不保留对委托实例的引用.您作为SetConsoleCtrlHandler()的第一个参数传递的那个.垃圾收集器无法通过非托管代码查看对委托对象的引用.因此,当垃圾收集器运行时,这最终会爆炸:
SetConsoleCtrlHandler(Handler,true);

这与完全相同

SetConsoleCtrlHandler(new EventHandler(Handler),true);

假设您使用了链接代码中的类型.该代码的作者通过使_handler成为静态变量来仔细避免此问题.与前两行代码创建的临时委托实例相反.将其存储在静态变量中可确保它在程序的生命周期内保持引用.在这个特殊情况下要做的事情,因为你实际上对事件感兴趣,直到程序结束.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读