37

マルチプロセスで読み書きされるtxtファイルABC.txtがあります。そのため、1 つのプロセスがファイル ABC.txt を読み書きしている場合、ファイル ABC.txt をロックして、他のプロセスが読み書きできないようにする必要があります。enum System.IO.FileShare がこの問題を処理する正しい方法である可能性があることを私は知っています。しかし、それが正しいかどうかわからない別の方法を使用しました。以下は私の解決策です。

別のファイル Lock.txt をフォルダーに追加しました。ファイル ABC.txt の読み取りまたは書き込みを行う前に、ファイル Lock.txt を読み取る機能が必要です。ファイル ABC.txt の読み取りまたは書き込みが完了したら、その機能を解放する必要があります。以下はコードです。

        #region Enter the lock
        FileStream lockFileStream = null;
        bool lockEntered = false;
        while (lockEntered == false)
        {
            try
            {
                lockFileStream = File.Open("Lock.txt", FileMode.Open, FileAccess.Read, FileShare.None);
                lockEntered = true;
            }
            catch (Exception)
            {
                Thread.Sleep(500);
            }
        }
        #endregion

        #region Do the work
        // Read from or write to File ABC.txt
        // Read from or write to other files
        #endregion

        #region Release the lock
        try
        {
            if (lockFileStream != null)
            {
                lockFileStream.Dispose();
            }
        }
        catch
        {
        }
        #endregion

私のコンピューターでは、この解決策はうまく機能しているように見えますが、それが適切かどうかはまだわかりません..

編集:同じプロセス内のマルチスレッドではなく、マルチプロセス。

4

4 に答える 4

54

C#'s named EventWaitHandle is the way to go here. Create an instance of wait handle in every process which wants to use that file and give it a name which is shared by all such processes.

EventWaitHandle waitHandle = new EventWaitHandle(true, EventResetMode.AutoReset, "SHARED_BY_ALL_PROCESSES");

Then when accessing the file wait on waitHandle and when finished processing file, set it so the next process in the queue may access it.

waitHandle.WaitOne();
/* process file*/
waitHandle.Set();

When you name an event wait handle then that name is shared across all processes in the operating system. Therefore in order to avoid possibility of collisions, use a guid for name ("SHARED_BY_ALL_PROCESSES" above).

于 2013-09-09T06:56:57.357 に答える
16

C# のミューテックスは、複数のプロセスで共有できます。以下は、1 つのファイルに書き込む複数のプロセスの例です。

using (var mutex = new Mutex(false, "Strand www.jakemdrew.com"))
{
    mutex.WaitOne();
    File.AppendAllText(outputFilePath,theFileText);
    mutex.ReleaseMutex();
}

システム全体で共有される一意の名前がミューテックスに付けられていることを確認する必要があります。

ここで追加の読書:

http://www.albahari.com/threading/part2.aspx#_Mutex

于 2016-06-29T05:42:36.380 に答える
4

あなたのソリューションはエラーが発生しやすいです。基本的に、非常に危険なダブルチェック ロック ( http://en.wikipedia.org/wiki/Double-checked_locking ) を実装しました。

より良い解決策は、スレッドの分離を導入することです。これにより、1 つのスレッドのみがファイルにアクセスし、他のスレッドによって読み取りまたは書き込みの要求が配置されたキューから読み取ることによってファイルにアクセスします (もちろん、キューは相互に排他的に保護されます)。スレッドによるアクセス) またはスレッドが同期デバイス (lockセクション、ミュートなど) によって、または他のファイル アクセス ロジック (たとえば、System.IO.FileShareここでいくつかの応答で出てきた) を使用して、スレッド自体を同期する場所。

于 2013-09-09T02:15:06.127 に答える