2012-01-13 53 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