该进程无法访问该文件,因为它正由另一个进程使用

时间:2012-06-14 08:43:13

标签: c# xml

我有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方法   失败。尝试#1。错误:System.IO.IOException:进程无法访问   文件'xxxx.xml'因为它   正在被另一个进程使用。       在System.IO .__ Error.WinIOError(Int32 errorCode,String maybeFullPath)       在System.IO.FileStream.Init(String path,FileMode mode,FileAccess access,Int32 rights,Boolean useRights,FileShare share,   Int32 bufferSize,FileOptions选项,SECURITY_ATTRIBUTES secAttrs,   String msgPath,Boolean bFromProxy)

我得到的异常是挂起我的作家线程,我不明白为什么。 你有什么建议?我该如何解决?

3 个答案:

答案 0 :(得分:2)

当其他进程正在编写时你无法读取,而当其他进程正在读取时你无法写入(它必须读取文件才能复制它;因此整个复制可能在端)。

在阅读器上使用FileSystemWatcher如何在文件写入(并关闭)后收到通知?作者可以使用FileSystemWatcher来跟踪文件的读取时间或等待完成。

作为替代方案,使用其他形式的进程间通信,例如, TCP / IP,共享内存等

或者 - 也许有点棘手(如果你不小心,你可能遇到死锁):使用Mutex进行同步。

答案 1 :(得分:1)

我在一个多线程应用程序中遇到了类似的问题,其中不同的线程试图访问同一个对象。对于访问该文件的每个对象,请尝试使用lock statement,以防止同时访问同一文件。

答案 2 :(得分: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( );
    }
}

因此,读取器和编写器仅在其方法运行时进行实例化,然后在方法完成时关闭。这段代码并不准确,但如果您认为有帮助,我可以将原件发送给您。希望能解释一下!