2012-06-14 16 views
1

我有2個程序,一個是序列化XXXX.xml,另一個是反序列化XXXX.xml.temp文件。這兩個程序都是單獨的,並使用不同的線程,每個預定義的時間間隔都會發生。進程無法訪問文件'',因爲它正在被另一個進程使用

以下是讀取xml的代碼。 這裏我得到了以下異常:因爲它正在被另一個進程使用

該進程無法訪問該文件'。

private void StartDiskFlushThread() 
    { 
     _flushThread = new Thread(ThreadProc); 
     _flushThread.IsBackground = true; 
     _flushThread.Start(); 
    } 

    private void ThreadProc() 
    { 
     try 
     { 
      while (_flushThread.IsAlive) 
      { 
       FlushStepsToFile(); 
       Thread.Sleep(_flushInterval); 
      } 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex); 
      Log.Error("ThreadProc failed", ex); 
     } 
    } 

    private void FlushStepsToFile() 
    { 
     try 
     { 
      SerializeSteps(1); 
     } 
     catch (Exception ex) 
     { 
      Log.Error("Failed to flush steps to disk, retrying", ex); 
      Thread.Sleep(1000); 
      SerializeSteps(2); 
     } 
    } 

    private void SerializeSteps(int trycount) 
    { 
     XmlSerializer serializer = new XmlSerializer(typeof(DetailedSteps)); 
     try 
     { 
      using (TextWriter textWriter = new StreamWriter(_targetFileLocation)) 
      { 
       serializer.Serialize(textWriter, _detailedSteps); 
      } 
     } 
     catch (Exception ex) 
     { 
      Log.ErrorFormat("SerializeSteps method failed. try #{0}. Error:{1}", trycount, ex); 
     } 
    } 

至於讀取xml的代碼。 該程序也是一個將XXXX.xml複製到XXXX.xml.temp並讀取臨時文件的線程。

private void CopyPartialLog() 
    { 
     try 
     { 
      File.Copy(ReportFile, DestReportFile, true); 
     } 
     catch (Exception ex) 
     { 
      Log.Error("CopyPartialLog failed", ex); 
     } 
    } 

我沒有例外那裏,因爲我讀不同的文件:XXXX.xml.temp

以下是例外,我是從第一個節目獲得該寫XML:

7077846 [SerializeSteps method failed. try #1. Error:System.IO.IOException: The process cannot access the file 'xxxx.xml' because it is being used by another process. at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy)

我得到的例外是掛我的作家線程,我不明白爲什麼。 你有什麼建議?我該如何解決它?

回答

2

當一些其他進程寫您無法讀取,當其他一些進程正在讀取你不能寫(它具有讀取文件進行復制;因此整個複製可能是最終毫無意義的)。

如何使用對讀者FileSystemWatcher一旦文件被寫入(或關閉),將得到通知?作者可以使用FileSystemWatcher來跟蹤文件正在被讀取的時間,或等待完成。

作爲替代,使用一些其他形式的進程間通信,例如, TCP/IP,共享內存等

或 - 也許更麻煩一些,(如果你不小心,你可能會遇到死鎖):使用互斥同步。

+0

作爲一種替代方法,我只是檢查是否得到該異常,表明它仍在使用中。我的意思是,真的,這就是爲什麼它是他們的 - 這個例外。但爲FileSystemWatcher建議+1! – SimpleVar

1

我有一個類似的問題,在多線程應用程序中,不同的線程試圖訪問同一個對象。嘗試對訪問文件的每個對象使用lock statement,以防止同時訪問同一文件。

+0

但這些是不同的程序 – user829174

+0

的確如此,但您也有Mutexes:http://msdn.microsoft。COM/EN-US /庫/ system.threading.mutex.aspx – Mario

0

我有一個與Xml工作幾乎相同的問題,因爲我已經同時實例化XmlReader & XmlWiter(您正在使用不同的方法,但具有相同的問題)。我所做的是在類中設置讀寫器變量,但不要實例化它們,直到他們自己的獨立方法。

public class XmlTool 
{ 
    public static string filepath = @"C:\\This\That\Folder"; 
    private static XmlReader reader; 
    private static XmlWriter writer; 

    public static void Write2Xml(string s) 
    { 
     writer = XmlWriter.Create(filepath); 
     /* Do Stuff */ 
     writer.Close(); 
    } 

    public static string ReadFromXml() 
    { 
     reader = XmlReader.Create(filepath); 
     /* Do Stuff */ 
     reader.Close(); 
    } 
} 

因此,讀寫器僅在其方法運行時實例化,然後在方法結束時關閉。這段代碼並不準確,但如果您認爲它有幫助,我可以向您發送帶有註釋的原件。希望解釋一下!

相關問題