为什么我的图像被其他进程锁定?

时间:2013-04-29 17:23:03

标签: c# .net wpf

我已经构建了一个在WPF中运行的数字标牌解决方案。我有一个处理调度的可执行文件和一些负责显示图像,视频等的外部程序集(带有用户控件的.dll)。

当应用程序启动时,它将所有程序集加载到一个列表中,然后使用带有配置信息的XML文件,从哪种幻灯片开始,使用哪些参数,如下所示:

<signage>
  <slide type="image" argument="c:\image1.png"/>
  <slide type="image" argument="c:\image2.png"/>
  <slide type="video" argument="c:\video1.mpg"/>
  ...
</signage>

该列表可能很长,包含许多不同的幻灯片。当我构建我要显示的对象列表时,我通过反射创建一个我需要显示的.dll的新实例,并将其传递给参数。这包含在列表中。然后,父可执行文件遍历列表并在我的主WPF应用程序上显示用户控件实例(实例化的幻灯片类型)。

这就是我的问题的背景。

当我需要更新运行时的内容时,我需要替换磁盘上的文件(image1,image2等...),但是得到一个例外,即另一个进程正在使用这些文件而我无法访问它们。 / p>

有关如何解决此问题的任何想法?有什么方法可以从我的应用程序中“卸载”它们吗?有没有办法以正确的方式做到这一点?

修改 以下是有关如何在图像装配中执行此操作的其他信息:

public ImageExtensionControl(XmlDocument document, Dictionary<string, string> settings, Action slideFinished)
        {
            InitializeComponent();
            string path = new FileInfo(Assembly.GetCallingAssembly().Location).Directory.FullName;
            string id = settings["Image"];
            path = System.IO.Path.Combine(path, document.SelectSingleNode("properties/files/file[@id='" + id + "']").Attributes["path"].Value);
            BitmapImage bitmapImage = new BitmapImage();
            bitmapImage.BeginInit();
            bitmapImage.UriSource = new Uri(path, UriKind.Absolute);
            bitmapImage.EndInit();
            this.myimage.Source = bitmapImage;
        }

2 个答案:

答案 0 :(得分:3)

如果要加载图像,请确保在完成操作后关闭图像流。例如,

using(var fs = new FileStream(...))
{
   // ...
}  // <-- Stream is closed and disposed.

答案 1 :(得分:2)

可能尝试缓存选项: Problems overwriting (re-saving) image when it was set as image source

imgTemp = new BitmapImage();
imgTemp.BeginInit();
imgTemp.CacheOption = BitmapCacheOption.OnLoad;
imgTemp.CreateOption = BitmapCreateOptions.IgnoreImageCache;
imgTemp.UriSource = uriSource;
imgTemp.EndInit();
imgAsset.Source = imgTemp;