簡體   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