【问题标题】:The process cannot access the file '' because it is being used by another process该进程无法访问文件'',因为它正被另一个进程使用
【发布时间】:2012-06-17 06:41:26
【问题描述】:

我有两个程序,一个是序列化 XXXX.xml,另一个是反序列化 XXXX.xml.temp 文件。 这 2 个程序是独立的,并且使用每个预定义的时间间隔发生的不同线程。

以下是读取 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 错误代码,字符串可能全路径) at 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)

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

【问题讨论】:

    标签: c# xml


    【解决方案1】:

    当其他进程正在写入时您无法读取,而当其他进程正在读取时您无法写入(它必须读取文件才能复制它;因此整个复制最终可能毫无意义)。

    如何在阅读器上使用FileSystemWatcher,一旦文件被写入(和关闭)就会收到通知?作者可以使用FileSystemWatcher 来跟踪文件何时被读取或等待读取完成。

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

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

    【讨论】:

    • 作为替代方案,我会检查我是否收到该异常以表明它仍在使用中。我的意思是,真的,这就是为什么它是他们的 - 那个例外。但是对于 FileSystemWatcher 的建议 +1!
    【解决方案2】:

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

    【讨论】:

    【解决方案3】:

    我在使用 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( );
        }
    }
    

    因此,reader 和 writer 仅在其方法运行时被实例化,然后在方法完成时关闭。此代码不准确,但如果您认为有帮助,我可以将原始代码与 cmets 一起发送给您。希望能解释一下!

    【讨论】:

      猜你喜欢
      • 2010-12-10
      相关资源
      最近更新 更多