我有一个C#.NET多线程应用程序冻结了界面。不寻常的是,除非我让系统闲置足够长的时间以使屏幕保护程序启动(这要求我重新输入密码以重新访问系统),否则界面不会冻结。当界面再次可见时(在我成功输入密码后),界面被锁定。只要我不让屏幕保护程序启动,那么界面不会锁定。多线程c#应用程序中的界面冻结
我应该指出,我有两个不同的可执行文件访问相同的DLL,并且无论使用哪个应用程序访问该DLL,都会发生此问题。这似乎意味着问题出在DLL上,因为除了它们与DLL的关联外,这两个应用程序完全不同(C++/MFC)和(C#/ .NET)。
这两个exes在它们如何与DLL交互时执行类似的步骤。他们调用dll来设置串口通信,在DLL中打开一个状态窗口,在DLL中启动一个线程来监视通信端口,然后在主应用程序中启动一个监视dll中栈的线程。
当通过DLL中的线程从通信端口获取数据时,将对其进行分析,并将其结果放置在堆栈上,然后通过委托将其发布到状态窗口。当exe中的线程看到堆栈中的数据时,它会使用委托在主窗口中输出数据。
我发现,如果我将代码添加到DLL中的线程,因此它每30秒调用一次Application.DoEvents(),界面将被冻结约30秒,然后像平常一样恢复活动。 我认为某些东西阻塞了主线程并强制DoEvents()发射似乎破坏了锁定,但我不知道可能会导致此锁定。
在我的开发机器和测试机器上都会出现此问题。
我已经尝试完全删除数据的输出到DLL中的状态窗口,但没有任何区别。
我一直在做多线程编程多年,从未见过这样的事情;所以任何意见将不胜感激。
谢谢。
暂停调试器中冻结的用户界面并查看调用堆栈。 – SLaks 2011-01-11 15:35:25
您是否尝试过仅从非UI线程调用DLL方法并编组到UI线程? – RobS 2011-01-11 15:36:35