簡體   English   中英

XmlSerializer-文件訪問異常

[英]XmlSerializer - File access Exception

我有一個簡單的頁面,可以從文件系統加載XML,填充文本框,可以更新和保存這些文本框。 對於序列化和反序列化,我使用以下方法:

private static readonly object FormDataLock = new object();

public static FormData getFormData(string filename)
{
    FormData fd;
    lock (FormDataLock)
    {
        XmlSerializer x = new XmlSerializer(typeof(FormData));
        using (Stream s = new FileStream(filename, FileMode.Open, FileAccess.Read))
        {
            return (FormData)x.Deserialize(s);
        }
    }
}

public void saveFormData(string filename)
{
    lock (FormDataLock)
    {
        XmlSerializer x = new XmlSerializer(typeof(FormData));
        using (Stream s = new FileStream(filename, FileMode.Create, FileAccess.Write))
        {
            x.Serialize(s, this);
        }
    }
}

但是問題是,有時候我很生氣(就像我注意到的那樣,當我在PageLoad之后太快地單擊“保存”按鈕時注意到)IOException:

IOException: The process cannot access the file ".." because it is being used by another process. 

我試圖用互斥鎖鎖定該塊,但它仍無法正常工作。 頁面表單非常簡單,但是我在上面使用UpdatePanel(這很重要嗎?)。

加載頁面並完成第一次保存請求后,我可以盡快單擊該按鈕,一切正常(無例外)。

XmlSerialization會動態創建新的dll,這些dll特定於您要在temp目錄中序列化的類。 創建這些是為了提高性能。 請參閱http://msdn.microsoft.com/en-us/library/swxzdhc0.aspx

而不是調用GC.Collect等...嘗試在您的類中將序列化器創建為靜態字段。 這將提高性能,並可能解決您的問題,因為它只會被創建一次。

此代碼將以線程安全的方式創建單個xmlserializer。 不要為此添加[ThreadStatic]屬性,因為這將確保每個線程執行一次代碼,並使其再次變得不安全!

private static readonly XmlSerializer xmlSerializer = 
    new XmlSerializer(typeof(FormData));

我有類似的問題,希望對您有幫助。 問題在於,垃圾收集器在第二次單擊之前沒有清理,因此您應該嘗試手動調用它。 嘗試在using前致電GC

GC.Collect();
GC.WaitForPendingFinalizers();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM