1

私は 2 つのプログラムを持っています。1 つは XXXX.xml をシリアル化し、もう 1 つは 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を試してください。Error:System.IO.IOException: 別のプロセスで使用されているため、プロセスはファイル 'xxxx.xml' にアクセスできません。System.IO.__Error.WinIOError (Int32 errorCode、文字列の多分フルパス) で System.IO.FileStream.Init (文字列パス、FileMode モード、FileAccess アクセス、Int32 権限、ブール値の useRights、FileShare 共有、Int32 bufferSize、FileOptions オプション、SECURITY_ATTRIBUTES secAttrs 、文字列 msgPath、ブール値 bFromProxy)

私が取得している例外は、ライター スレッドをハングアップさせることであり、その理由がわかりません。何を指示してるんですか?どうすれば解決できますか?

4

3 に答える 3

2

他のプロセスが書き込み中の場合は読み取ることができず、他のプロセスが読み取り中の場合は書き込むことができません(ファイルをコピーするにはファイルを読み取る必要があるため、コピー全体が最終的に無意味になる可能性があります)。

FileSystemWatcherファイルが書き込まれる (そして閉じられる) と通知されるリーダーで を使用するのはどうですか? ライターはFileSystemWatcher、ファイルがいつ読み取られているかを追跡するか、それが完了するまで待機するために使用できます。

別の方法として、他の形式のプロセス間通信 (TCP/IP、共有メモリなど) を使用します。

または - もう少しトリッキーかもしれません (注意しないとデッドロックが発生する可能性があります): Mutex を使用して同期します。

于 2012-06-14T08:48:16.200 に答える
1

マルチスレッドアプリケーションで、異なるスレッドが同じオブジェクトにアクセスしようとしていた同様の問題がありました。ファイルにアクセスするオブジェクトごとにlock ステートメントを使用して、同じファイルへの同時アクセスを防止してください。

于 2012-06-14T08:53:34.827 に答える
0

XmlReader と XmlWiter を同時にインスタンス化したため、Xml の操作でほぼ同じ問題が発生しました (異なる方法を使用していますが、同じ問題があります)。私がしたことは、クラスでリーダー/ライター変数を設定することでしたが、独自の別のメソッドまでそれらをインスタンス化することはしませんでした。

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

したがって、リーダーとライターは、メソッドの実行中にのみインスタンス化され、メソッドが終了すると閉じられます。このコードは正確ではありませんが、役に立つと思われる場合は、コメントを付けて元のコードを送信できます。それが少し説明することを願っています!

于 2012-06-21T19:50:27.383 に答える