我打開FileStream
與FileMode.Open
和FileAccess.Read
。不久之後,我調用一個函數來處理文件的內容。我使用Invoke
撥打電話,因爲該電話來自Thread
,該功能必須將結果放在Form
上。該函數接受任何類型的流(我也稱它爲MemoryStream
也沒有問題),並使用XmlTextReader
讀取FileStream
中的XML,但在罕見情況下,由於未知原因,即使第一個Read()
也會拋出ObjectDisposedException
,並且流的CanRead
屬性返回如果該流已關閉,則爲false。新的FileStream已經關閉/處理?
在Thread
的FileStream
是本地using
變量,所以我不認爲其他線程應該可以關閉它,我不關閉,直到返回Invoke
。沒有Exceptions
拋出所以該文件是有限的(因爲沒有FileNotFoundException
),應該正確訪問(因爲沒有UnauthorizedAccessException
和IOException
)。
我的FileStream
在打開後有時還會關閉?
(也許沒關係,我現在運行我在Windows CE 5設備上的代碼Compact Framework的3.5和我無法重現我的XP桌面PC上相同的行爲呢。)
編輯: 我知道,這個調用是醜陋的,但這不能是一個失敗的理由,可以嗎? (並且在大多數情況下它根本不會失敗。)
//the code in the thread
//...
using (FileStream fs = File.Open(assemblyPath + "\\white.xml", FileMode.Open, FileAccess.Read))
{
mainForm.Instance.Invoke(new DataHandler(mainForm.Instance.handleData), new object[] { fs });
}
//...
//and the handler
public void handleData(Stream stream)
{
infoPanel.SuspendLayout();
try
{
using (XmlTextReader xml = new XmlTextReader(stream))
{
//it doesn't matter what is here
}
}
catch{}
}
聽起來好像是打開的文件已經關閉了流的其他線程有機會到之前的線程在...上下功夫。很可能你應該在打開它的線程中完全處理該文件,並使用'Invoke'來傳遞整個字符串或進度的增量通知。但是不要將整個Stream傳遞給'Invoke'。你可以發佈你的代碼是打開文件,也是'Invoke'的處理程序? – 2010-10-13 13:55:48