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 方法失败。尝试#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 options, SECURITY_ATTRIBUTES secAttrs , 字符串 msgPath, 布尔 bFromProxy)

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

4

3 回答 3

2

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

FileSystemWatcher在文件被写入(和关闭)后会收到通知的阅读器上使用怎么样?作者可以使用 aFileSystemWatcher来跟踪文件何时被读取或等到完成。

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

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

于 2012-06-14T08:48:16.200 回答
1

I had a similiar issue, in a multi-threaded application, where different threads were trying to access the same object. Try using the lock statement, for each object that access the file, to prevent simultaneous access to the same file.

于 2012-06-14T08:53:34.827 回答
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( );
    }
}

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

于 2012-06-21T19:50:27.383 回答