Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 进程无法访问文件'';因为它正被另一个进程使用_C#_Xml - Fatal编程技术网

C# 进程无法访问文件'';因为它正被另一个进程使用

C# 进程无法访问文件'';因为它正被另一个进程使用,c#,xml,C#,Xml,我有两个程序,一个是序列化XXXX.xml,另一个是反序列化XXXX.xml.temp文件。 这两个程序是单独的,并且使用每个预定义间隔发生的不同线程 下面是读取xml的代码。 这里我得到了以下例外: 进程无法访问文件“”,因为另一个进程正在使用该文件 private void StartDiskFlushThread() { _flushThread = new Thread(ThreadProc); _flushThread.IsBackgro

我有两个程序,一个是序列化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,然后读取temp文件

    private void CopyPartialLog()
    {
        try
        {
            File.Copy(ReportFile, DestReportFile, true);
        }
        catch (Exception ex)
        {
            Log.Error("CopyPartialLog failed", ex);
        }
    }
我没有例外,因为我正在读取不同的文件:XXXX.xml.temp

以下是我从第一个编写xml的程序中得到的例外:

7077846[序列化步骤方法] 失败。请重试#1。错误:System.IO.IOException:进程无法访问 文件“xxxx.xml”因为 正在被另一个进程使用。 在System.IO.\uuu Error.WinIOError(Int32 errorCode,字符串maybeFullPath) 在System.IO.FileStream.Init(字符串路径、文件模式、文件访问权限、Int32权限、布尔用户权限、文件共享、, Int32 bufferSize、FileOptions选项、安全属性secAttrs、, 字符串msgPath,布尔bFromProxy)

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

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

在读卡器上使用
FileSystemWatcher
如何?一旦文件被写入(并关闭),读卡器将收到通知?编写器可以使用
FileSystemWatcher
跟踪文件被读取的时间或等待文件被读取完毕

另一种方法是使用其他形式的进程间通信,例如TCP/IP、共享内存等


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

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

我在使用Xml时遇到了几乎相同的问题,因为我实例化了XmlReader&XmlWiter(您使用不同的方法,但有相同的问题)。我所做的是在类中设置reader/writer变量,但在它们各自独立的方法之前不实例化它们

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( );
    }
}

因此,读写器仅在其方法运行时实例化,然后在方法完成时关闭。此代码不准确,但如果您认为有帮助,我可以向您发送带有注释的原始代码。希望这能解释一点!

但这些是不同的程序这是正确的,但您也有互斥体:作为替代,我只想检查我是否得到了这个异常作为它仍然在使用的指示。我的意思是,真的,这就是为什么它是他们的-那个异常。但是对于FileSystemWatcher建议+1!