为什么File.Open这么贵

本文关键字:Open File 为什么 | 更新日期: 2023-09-27 17:59:13

我有以下代码:

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;
}

因为这个程序是在两台访问同一文件夹以拾取文件的电脑上运行的,所以当一台电脑打开一个文件,然后移动到列表中的下一个文件时,它会引发异常。

当我同时在两台电脑上打开应用程序时,第一台电脑设法打开了图像,但第二台电脑没有。我在屏幕上同时显示4个图像,但进行一些调试显示,第二台电脑在打开4个文件时需要10.5秒才能找到一个可以打开的文件。

为什么这么贵?我该怎么办才能加快速度?

更新:我授予它独占访问权限,因为我希望应用程序显示唯一的图像,因此PC1显示图像1,2,3,4,PC显示图像5,6,7,8,因为它无法访问1,2,3,4。然后,一旦我完成了文件流,我也会在最后一刻释放它,这样它就可以防止其他应用程序试图打开它。

为什么File.Open这么贵

您正在以FileAccess.ReadWrite的形式打开文件(您似乎没有在写)。你告诉它你不想共享文件FileShare.None(所以第一台获得文件的电脑获胜)。

此外,你永远不会关闭溪流。因此,首先获取文件的PC会一直保留它,直到垃圾收集器为您关闭流。当你把你的流包装在一个使用块中,这样文件就会自动关闭:

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.

我不能明确回答,但我最好的建议是,系统中的某些东西,无论是在.net框架类还是文件系统中,都在实现超时/重试机制,以防文件共享失败。这可以解释你报告的过度拖延。

编辑后

由于您希望它们被锁定,您可以考虑滚动一个轻量级数据库(sqllite、xml等),用于将文件标记为"正在使用"。然后在该方法中,您将检查它是否在使用中。这将消除在尝试打开锁定文件时等待File.Open超时的情况。

原始

我想我应该回答而不是评论。。。

try
{
    string fileName = imageQueue.Dequeue();
    using( FileStream fileStream = File.Open( fileName, FileMode.Open, FileAccess.Read, FileShare.Read) )
    {
        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;
}

您尝试过这些流属性吗?如果没有其他东西,你可能可以最小化超时:

http://msdn.microsoft.com/en-us/library/470w48b4.aspx