2011-06-16 78 views
3

我有以下代码:为什么File.Open如此昂贵?

try 
{ 
    string fileName = imageQueue.Dequeue(); 
    FileStream fileStream = File.Open(
     fileName, FileMode.Open, FileAccess.ReadWrite, FileShare.None); 
    Bitmap bitmap = new Bitmap(fileStream); 
    Image picture = (Image)bitmap; 
    pb.Tag = fileName; 
    pb.Image = picture; 
    return true; 
} 
catch (Exception ex) 
{ 
    errorCount++; 
    //If another PC has this image open it will error 
    return false; 
} 

因为这个计划是在2 PC的运行访问同一个文件夹来接档涨它就会抛出一个异常,当一个人有一个文件打开,然后移动到的下一个文件它的名单。

当我在2台PC上同时打开应用程序时,第一台个人电脑设法打开图像,但第二台设备没有打开图像。我在屏幕上一次显示4张图像,但做一些调试显示,第二台PC在打开4个文件之前需要10.5秒才能失败,然后才能找到可打开的文件。

为什么这么贵,我能做些什么来加快速度?

更新:我给它独占访问,因为我希望应用程序显示独特的图像,所以PC1显示图像1,2,3,4和PC显示5,6,7,8,因为它无法获得acccess到1 ,2,3,4。我还会在完成之后释放文件流并在最后时刻释放文件流,以防止其他应用程序尝试打开它。

+1

你需要有读写权限打开的文件?如果不考虑让他们读取访问权限,然后将FileShare枚举更改为使用Read。 http://msdn.microsoft.com/en-us/library/system.io.fileshare.aspx – 2011-06-16 12:19:53

+2

另外,考虑包装FileStream fileStream = File.Open(fileName,FileMode.Open,FileAccess.ReadWrite,FileShare.None) ;是一个using(){}块,以便在完成后立即释放资源。 – 2011-06-16 12:20:56

+1

2.6秒在打开锁定文件时失败过多。这必须是环保的。很难猜到可能是什么。 – 2011-06-16 12:50:35

回答

3

我无法明确回答,但我最好的建议是,在.net框架类或文件系统中,系统中的某些内容在文件共享失败的情况下实现超时/重试机制。这可以解释你报告的过度延误。

+0

我不能让第二台电脑显示与第一台电脑相同的内容,因此为什么我给它独占访问权限。 – Jon 2011-06-16 12:22:45

+0

请在您的问题中添加该细节。 – 2011-06-16 12:24:48

+0

谢谢,问题更新。到解决方案,嗯mmmm ... – Jon 2011-06-16 12:26:05

4

您正在打开文件为FileAccess.ReadWrite(您似乎没有写入)。你告诉它,你不想分享文件,FileShare.None,(所以第一台PC获得文件胜利)。

此外,你永远不会关闭流。因此,获取文件的PC首先会保留它,直到垃圾收集器为您关闭流。当您在流包装在using块,以便该文件将自动关闭:

using (FileStream fileStream = File.Open(fileName, FileMode.Open, FileAccess.ReadWrite, FileShare.None) 
{ 
    // Do stuff with the filestream 
} 
// The stream will be closed when the closing brace is passed. 
+0

我不能让第二台电脑显示与第一台电脑相同的内容,因此为什么我给它独占访问权限。然后在完成后关闭文件流 – Jon 2011-06-16 12:23:27

3

后编辑

既然你想让他们被锁定,你可能会考虑滚动重量轻数据库( sqllite,xml等),您可以使用它来标记文件为“正在使用”。然后在该方法中,您将检查是否正在使用。这将消除在尝试打开锁定文件时不得不等待File.Open超时。

原始

我想我应该回答,而不是评论...

​​
+0

应用程序轮询目录以查找新文件,因此需要以某种方式进行插入,并且何时更新列以表明其正在使用中,一旦文件没有抛出例外,因为这仍然会给时间问题。 – Jon 2011-06-16 12:40:13

+0

在process1打开文件之前,您检查文件是否正在使用,然后更新db以表明文件正在使用(如果process2同时声明了同一文件,则此操作需要优雅地失败),然后process1可以开始使用该文件 – Patrick 2011-06-16 15:10:57