Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么文件打开这么贵?_C#_.net_File_Exception_File Io - Fatal编程技术网

C# 为什么文件打开这么贵?

C# 为什么文件打开这么贵?,c#,.net,file,exception,file-io,C#,.net,File,Exception,File Io,我有以下代码: 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;

我有以下代码:

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上,访问同一文件夹以拾取文件,因此当一台PC打开一个文件,然后移动到其列表中的下一个文件时,它将引发异常

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

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


更新:我给它独占访问权,因为我希望应用程序显示唯一的图像,所以PC1显示图像1,2,3,4,而PC显示图像5,6,7,8,因为它无法访问1,2,3,4。然后,我还会在完成文件流之后,在最后一个可能的时刻释放它,以防止其他应用程序试图打开它。

我不能肯定地回答,但我最好的建议是系统中的某些东西,无论是在.net framework类中还是在文件系统中,正在实施文件共享失败时的超时/重试机制。这可以解释您报告的异常延迟。

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

而且,您从不关闭流。因此,首先获取文件的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.

编辑后

<> P>因为你希望它们被锁定,你可以考虑滚动一个轻量级的数据库(SQL LITE、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;
}

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


您需要使用读写访问权限打开文件吗?如果不考虑让它们读访问,然后改变文件列表枚举,使用Read。此外,考虑包装FielestRAMFILSTRAMAM=文件.OPEN(文件名,FILMODED.OPENT,FILAccess .Read Wrrad,FielsHay.No.1);是一个using(){}块,用于在完成后立即释放资源。打开锁定文件失败2.6秒是多余的。这必须是环保的。很难猜测这可能是什么。你真的不想把文件流作为一种静音方法,它会给你意想不到的结果,比如在第二个任务打开文件之前等待10.5秒。。。请尝试使用每个进程都可以读取的控制文件(或db表)来了解另一个进程正在做什么,并使用写入来告诉另一个进程允许做什么。@Patrick这真的有帮助吗?你如何避免种族冲突?我不能允许第二台电脑显示与第一台相同的内容,因此我授予它独占访问权限。请将该细节添加到你的问题中。我需要独占访问权限,以便其他应用程序无法打开同一文件。应用程序的每个实例都需要显示来自同一文件夹的唯一图像。@Jon我现在明白你的问题了,你读了我更新的答案了吗?是的,但你说要将文件共享改为读取,以便其他进程可以读取文件。我不希望我不能让第二台电脑显示与第一台相同的内容,因此我给它独占访问权。然后,当我完成时,我会关闭文件流。应用程序会轮询一个目录以查找新文件,因此它需要以某种方式进行插入,并且当文件没有引发异常时,您会在何时更新列以表明其正在使用,因为这仍然会带来时间问题。在process1打开文件之前,请检查该文件是否正在使用,然后更新数据库,说明文件正在使用中(如果process2同时声明了相同的文件,则此操作需要正常失败),然后process1可以开始使用该文件