2013-04-29 73 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

相關問題