C# 以多线程方式加载图像
当我试图在独立线程中加载映像的源代码时,会导致内存泄漏(大量HWNd指针)(C# 以多线程方式加载图像,c#,wpf,multithreading,image,memory-leaks,C#,Wpf,Multithreading,Image,Memory Leaks,当我试图在独立线程中加载映像的源代码时,会导致内存泄漏(大量HWNd指针)(ImgSource1是VM上的可绑定属性) 如果您有可能绑定Image控件的Source属性,并设置IsAsync=True,wpf将关心自己在后台线程中获取图像 一般来说,如果控件定义了名称(或x:Name),wpf将在内存中保留控件,因此您应该注意这一点。如果您可以绑定Image控件的Source属性,并设置IsAsync=True,wpf将关心自己在背景线程中获取图像 一般来说,如果控件定义了名称(或x:Name)
ImgSource1
是VM上的可绑定属性)
如果您有可能绑定
Image
控件的Source
属性,并设置IsAsync=True
,wpf将关心自己在后台线程中获取图像
一般来说,如果控件定义了名称(或x:Name),wpf将在内存中保留控件,因此您应该注意这一点。如果您可以绑定
Image
控件的Source
属性,并设置IsAsync=True
,wpf将关心自己在背景线程中获取图像
一般来说,如果控件定义了名称(或x:Name),wpf将在内存中保留控件,因此您应该注意这一点。您使用的是什么.NET版本?您尚未显示
CreateImageSource
中发生了什么以及imageList
是什么。您可能正在分配一些应该调用dispose()的图像资源开着,但你不在t@Sam.Net 4.6@Clemens CreateImageSource()列在一篇文章的末尾,而imageList
只是一个文件名列表。您使用的是什么.Net版本?您尚未显示CreateImageSource
中发生了什么以及imageList
是什么。您可能正在分配一些应该调用的图像资源)开着,但你不在t@Sam.Net 4.6@Clemens CreateImageSource()列在帖子末尾,而imageList
只是一个文件名列表。感谢您的帮助。今晚刚刚测试过,目前为止效果良好,将长期测试。感谢您的帮助。今晚刚刚测试过,目前为止效果良好,将长期测试。
Thread task = new Thread(() =>
{
try
{
ImageSource newSource = CreateImageSource(imageList[CurrentSourceIndex], true);
Application.Current.Dispatcher.Invoke(() =>
{
ImgSource1 = newSource; // <== Memory leak is here
});
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();
}
catch(Exception ex)
{
LogService.WriteLog(ex);
}
IsImageChangeAccessible = true;
});
task.IsBackground = true;
task.Start();
var src = new BitmapImage();
src.BeginInit();
src.UriSource = new Uri(file, UriKind.Absolute);
src.CacheOption = BitmapCacheOption.OnLoad;
src.EndInit();
src.Freeze();
return src;