2013-04-29 32 views
1

我已经构建了一个在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等),但得到一个异常,该文件正在被另一个进程使用,并且我无法访问它们。

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

编辑 这里是我如何做到这一点的图像组件一些额外的信息:

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; 
     } 
+0

不言自明的:也许他们都与Windows图片查看器,你的应用程序的另一个副本开放,或者你不关闭使用它的流。如果他们刚刚写信,它可能是防病毒/安全软件将其打开。如果有人通过网络共享打开相同的消息也适用。 – 2013-04-29 17:54:30

回答

3

如果您加载您的图像,确保您关闭流一旦你完成与您的操作。例如,

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

我在我的xaml中使用了组件。它在用户控制中,我不知道这是否是问题? – 2013-04-29 17:28:00

相关问题