web-dev-qa-db-ja.com

複数のスレッドが同じファイルに書き込むことができるようにする方法

「vholders.txt」というテキストファイルを入手しました。

ここでわかるように、私は複数のスレッドを作成しています。これらのスレッドは、指定された独自のデータを処理し、最後に独自の出力をvholders.txtに書き込みます。しかし、IO例外原因ファイルが別のスレッドによって使用されています。他のスレッドと衝突することなくvholders.txtファイルに書き込む方法を教えてください。最初に書き込むスレッドのシーケンスでは、関係ない。

これは私のコードです:

public void execute()
    {
        for(int x=0;x<entered_length;x++)
        {
            ThreadPool.QueueUserWorkItem(new WaitCallback(PooledProc),x);
        }

    }
    private void PooledProc(object x_)
    {
        string output = string.Empty;
        //does the processing...and assign output its value...
        /*this is where I get error*/
        StreamWriter sw = File.AppendText("vholders.txt"); //error, file is being used by another process
        sw.WriteLine(output);
        sw.Close();
        /*Now how can I write the output value to the text file vholders.txt without getting IO Exception*/
    }
2
AKC

C#では、 ReaderWriteLock クラスを使用して、ファイル(および必要な場合は複数のリーダー)で単一の書き込み操作を許可できます。

また、パフォーマンスを最大化するために、 Asynchronous File I/O を使用して非同期操作を行うことができます(I/O操作の実行中に処理を行うことができます) 。

ただし、これらの概念について説明する前に、問題の最も簡単な解決策を得るために、いくつかの点を明確にする必要があります。

  1. 書き込み中にファイルからリーダーを持っていますか?
  2. これは継続的なプロセスですか、それとも1日に数回しか発生しませんか?
  3. 大きなデータ(GB)を処理していますか?

上記のすべての質問に対する答えがNoである場合、メモリ内のすべての処理を実行し、すべての 出力を一度に書き込むことを検討してください。

6
Alexei