我开发了WPF应用程序。在那个应用程序中,iam将200mb的照片加载到列表框中。之后我将这些图像添加到canvas.Bhile一段时间后将照片添加到画布(即添加10mb图像后),我得到一些错误,如----
***** CLR无法从COM上下文0x10b46f0转换到COM上下文0x10b4860达60秒。拥有目标上下文/公寓的线程很可能是在非抽空等待或处理非常长时间运行的操作而不抽取Windows消息。这种情况通常会对性能产生负面影响,甚至可能导致应用程序变得无响应或内存使用量随时间不断累积。为了避免这个问题,所有单线程单元(STA)线程都应该使用抽取等待原语(例如CoWaitForMultipleHandles)并在长时间运行期间定期泵送消息。*****
有没有办法提高我的应用程序的性能。我需要一个解决这个问题的方法。
对此有任何建议。
答案 0 :(得分:5)
不要在UI线程上一次性将所有200 MB的照片加载到列表框中。用户是否会同时查看200 mb?您需要做一些工作,但是您需要从后台线程中延迟加载图像。
答案 1 :(得分:3)
看看这个article(避免和检测.NET应用程序中的死锁的高级技术),它可能会有所帮助。
答案 2 :(得分:0)
这看起来像两个问题,第一个是您在后台线程中加载图像,但没有正确执行;因此,COM错误。仔细检查您是否有一个STAThread应用程序,并且图像加载线程没有错误地与WPF分派线程交互。这是discussion MTA与STA的比较;然而,WPF需要STA,而且这是一场激烈的战斗。
第二个问题似乎是应该如何做到这一点;也就是说,加载一堆图像进行显示。我将研究使用ListView的惰性数据绑定,并让内置的虚拟化演示者管理图像的加载/显示。
以下是使用view-model的一些文档。 viewmodel可以协调图像加载,并为ListView提供一个绑定源,可以自动使应用程序正常工作。
更简单的替代方法可能是启动后台线程并将图像加载到ObservableCollection<>中,将其绑定到ListView并让框架处理显示。
我是Greg D所说的,加载200mb的图像听起来像是一个问题的秘诀。