加载 DLL 阻塞 UI 线程

Posted

技术标签:

【中文标题】加载 DLL 阻塞 UI 线程【英文标题】:Load DLL blocking UI thread 【发布时间】:2011-12-07 00:20:12 【问题描述】:

在我的应用程序中,某些 dll 仅用于特定操作,而 99.9% 的使用操作不会发生。因此,为了节省加载时间和内存,这些加载是根据需要使用LoadLibrary 动态加载的。

为了让用户了解并响应程序库正在一个单独的线程上加载,然后在它们可用时通知 UI 线程并且该过程可以继续。

但是在我的实验中,当LoadLibrary 运行时,UI 线程被锁定并且事件队列无论如何都没有被处理,从而使应用程序锁定并且屏幕不再重绘。

LoadLibrary 上的 MSDN 未提及此行为,是否可以在事件队列仍在处理时在一个线程中加载 dll?

【问题讨论】:

UI 线程停止发送消息时在做什么? (也就是说,如果你附加调试器并在它不抽水时中断,它在调用什么?) 好主意忘了做,我会检查 这是不必要的自我惩罚。使用链接器的 /DELAYLOAD 选项。 如果加载的 dll 中的 dllMain 需要很长时间,则 loaderLock 保持同样的时间。那么很容易想象 GIU 线程会在 loaderLock 上被阻塞。正如詹姆斯建议的那样,使用调试器应该也很容易。 【参考方案1】:

异步加载 dll 时没有问题,这与 Visual Studio 调试器从符号服务器查找新加载的 dll 的符号有关。

当符号服务器被禁用或应用程序在没有调试器的情况下运行时,LoadLibrary 的执行不会出现锁定

【讨论】:

以上是关于加载 DLL 阻塞 UI 线程的主要内容,如果未能解决你的问题,请参考以下文章

解决多个ajax页面请求,页面loading阻塞问题

本机调用阻塞主线程

浅谈android中的异步加载一

Android Studio学习随笔-UI线程阻塞以及优化

如何追踪阻塞主(UI)线程的调用?

为啥 File.ReadAllLinesAsync() 会阻塞 UI 线程?