我有一个冻结界面的ac#.NET多线程应用程序.这有什么不寻常之处在于界面不会冻结,除非我让系统闲置足够长时间以启动屏幕保护程序(这需要我重新输入我的密码以重新获得对系统的访问权限).当界面再次可见时(在我成功输入密码后),界面被锁定.只要我不让屏幕保护程序启动,那么界面就不会锁定.
我应该指出,我有两个不同的可执行文件访问相同的DLL,无论我使用哪个应用程序访问DLL,都会出现此问题.这似乎意味着问题出在DLL中,因为两个应用程序完全不同(C++/MFC)和(C#/ .NET),除了它们与DLL的关系.
两个exes在如何与DLL交互时执行类似的步骤.他们调用dll来设置串口通信,打开DLL中的状态窗口,启动DLL中的线程来监视comm端口,然后在主应用程序中启动一个监视dll中堆栈的线程.
当DLL中的线程从通信端口获取数据时,将对其进行解析,并将其结果放在堆栈上,然后通过委托将其发布到状态窗口.当exe中的线程看到堆栈中的数据时,它也会使用委托在主窗口中输出数据.
我发现如果我在DLL中的线程中添加代码,每30秒调用一次Application.DoEvents(),接口将被冻结约30秒,然后恢复活动,就像正常一样.我认为阻塞主线程的东西并强制DoEvents()触发似乎打破了锁定,但我不知道是什么原因导致这个锁定.
在我的开发计算机和测试计算机上都会出现此问题.
我已经尝试将数据输出完全删除到DLL内的状态窗口,但这没有任何区别.
多年来我一直在做多线程编程,从未见过这样的事情.所以任何建议将不胜感激.
谢谢.