繁体   English   中英

为什么File.Open如此昂贵?

[英]Why is File.Open so expensive?

我有以下代码:

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上同时打开应用程序时,第一台PC设法打开图像,但第二台PC没有。 我在屏幕上一次显示4张图像,但是进行一些调试显示第二台PC在打开4个文件之前需要10.5秒才能失败才能找到可以打开的文件。

为什么这么贵,我该怎么做才能加快速度呢?

更新:我给它独家访问权限,因为我希望应用程序显示独特的图像,因此PC1显示图像1,2,3,4和PC显示5,6,7,8,因为它无法接受1,2,3,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.

我无法肯定地回答,但我最好的建议是系统中的某些内容,无论是在.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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM