2012-01-13 71 views
1

嗨,我遇到了一些麻煩,我是想知道如何在一個新的線程讀取XML文件,繼承人基本上就是我想要做的事:在新線程中打開XML文件?

//This is ran when the user presses the Enter Key 
Thread LoadThread = new Thread(new ThreadStart(Test)); 
LoadThread.Start(); 

private static void Test() 
{ 
    FileStream stream = File.Open("TEST_1.xml", FileMode.Open); 
    //---- 
    // Code Using File (I know this stuff works) 
    //---- 
    stream.Close(); 
} 

這裏的錯誤。

Directory \ TEST_1.xml',因爲它正在被另一個進程使用。

但是,當它不是它自己的線程它工作正常嗎?

感謝您的幫助,如果這樣做不能這樣做,我怎麼能打開文件沒有它讓我的程序凍結,直到文件已被打開?

再次感謝。

+0

您是否在使用進程資源管理器查看當您嘗試讀取文件時鎖定了哪些文件? – RQDQ 2012-01-13 03:19:10

+0

@Dusy - 嘗試在非線程方法中打開該文件並查看會發生什麼? – adatapost 2012-01-13 03:31:51

+0

把'try'' catch'塊和close流放在'finally'塊中。 'finally {stream.Close(); }'也嘗試'stream.Flush();'&'stream.Dispose();'這有幫助嗎? – 2012-01-13 04:37:41

回答

1

我把你的示例代碼,並沒有遇到任何問題。但是,當我在讀取文件時按下Enter鍵時,我的確遇到了同樣的異常。 (即按回車鍵兩次)是否有可能你有兩個處理Enter鍵的鍵,它們都觸發這個文件被打開。您可以在File.Open語句中放置一個斷點,並查看異常發生之前它被命中了多少次。

+0

好吧讓我試一試 – Dusty 2012-01-13 04:32:59

+0

哇,謝謝你,簡直不敢相信它是如此簡單:)我終於可以繼續並完成其他事情 – Dusty 2012-01-13 04:36:46

+0

很高興聽到它的固定,祝你好運與其餘的項目 – 2012-01-13 04:39:04

0

您是否有寫入該文件的代碼或進程?如果是這樣,你需要做一些鎖定:

private static object _fileLock = new object(); 

private static void Test() 
{ 
    lock(_fileLock) 
    { 
     using(FileStream stream = File.Open("TEST_1.xml", FileMode.Open)) 
     { 
      //Stuff you know works 
     } 
    } 
} 
+0

嘗試使用您的代碼,說_fileLock不存在於其當前的上下文中,我仍然是這樣的東西很新,感謝您的幫助或有什麼我失蹤? – Dusty 2012-01-13 03:29:56

+0

您是否在聲明Test()的相同類中聲明瞭_fileLock? – RQDQ 2012-01-13 03:33:19

+0

你讓虛空無效?看起來RQDQ與他的capitols搞砸了。 – MyKuLLSKI 2012-01-13 03:34:20