2013-02-19 150 views
0

嘗試將從二進制文件讀取的元素添加到BindingList<Type>時,出現了一個奇怪的問題。這是錯誤的一段代碼:將元素從一個列表添加到另一個列表時發生IOException

BindingList<Type> tmpList = null; 
using (FileStream serializedListStream = File.OpenRead(_kReificableDroidsListPath)) 
{ 
    BinaryFormatter serializer = new BinaryFormatter(); 

    //Temporary list so that ListChanged event is fired 
    //upon adding new types 
    tmpList = serializer.Deserialize(serializedListStream) as BindingList<Type>; 
    foreach (Type droidType in tmpList) 
    { 
     ReificableDroids.Add(droidType); 
    } 
} 

Visual Studio調試器告訴我這個異常:

System.IO.IOException: The process cannot access the file 'C:\Users\Zoneur\documents\visual studio 2012\Projects\Droid TP1\Droid TP2\bin\Debug\reificable_droids_list.bin' because it is being used by another process.

我的理解是,該文件需要被關閉,所以我把我的foreach環出了using聲明,像這樣的:

BindingList<Type> tmpList = null; 
using (FileStream serializedListStream = File.OpenRead(_kReificableDroidsListPath)) 
{ 
    BinaryFormatter serializer = new BinaryFormatter(); 

    //Temporary list so that ListChanged event is fired 
    //upon adding new types 
    tmpList = serializer.Deserialize(serializedListStream) as BindingList<Type>; 
} 
foreach (Type droidType in tmpList) 
{ 
    ReificableDroids.Add(droidType); 
} 

唯一的例外是不再拋出,但我不能明白什麼是問題... ReificableDroids是類型BindingList<Type>的財產。

而且,如果我把我的using聲明foreach循環,只打印類型名稱這樣的控制檯:

foreach (Type droidType in tmpList) 
{ 
    Console.WriteLine(droidType.GetType().ToString()); 
} 

也不例外要麼拋出。

有誰知道什麼可能會導致此使用聲明中引發此異常嗎?

+0

您是否在代碼邏輯中創建了'_kReificableDroidsListPath'文件?我無法重現該問題。 – 2013-02-19 13:23:00

+0

該文件存在於我的磁盤上並在早期創建。另外,如果找不到文件,我會處理異常 – Zoneur 2013-02-19 13:41:39

回答

1

我沒有看到這個異常可能與你正在循環加載數據的地方有任何關係。它必須是相關的東西,而不是在這裏顯示。

清單:

  • 沒有這種現象發生多少次?
  • 你處理AddingNewListChanged事件的BindingList並可能從那裏再次訪問該文件?
  • 你有多個併發呼叫你顯示的方法?
+0

我確實在我的'ListChanged'處理程序中訪問我的文件!我正在重構我的代碼以適應MVVM模式,並忘記刪除此處理程序。謝謝!好的演繹:) – Zoneur 2013-02-19 13:44:13

相關問題