多进程读写一个文件

Lcn*_*cng 30 c# multithreading

我有一个txt文件ABC.txt,它将由多个进程读取和写入.因此,当一个进程正在读取或写入文件ABC.txt时,必须锁定文件ABC.txt,以便任何其他进程无法读取或写入它.我知道枚举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
Run Code Online (Sandbox Code Playgroud)

在我的电脑上,似乎这个解决方案运行良好,但我仍然无法确定它是否合适.

编辑:多个进程,而不是同一进程中的多线程.

byt*_*ire 46

C#的名字叫EventWaitHandle就是去的地方.在每个想要使用该文件的进程中创建一个等待句柄实例,并为其指定一个由所有此类进程共享的名称.

EventWaitHandle waitHandle = new EventWaitHandle(true, EventResetMode.AutoReset, "SHARED_BY_ALL_PROCESSES");
Run Code Online (Sandbox Code Playgroud)

然后在访问文件等待waitHandle和完成处理文件时,设置它以便队列中的下一个进程可以访问它.

waitHandle.WaitOne();
/* process file*/
waitHandle.Set();
Run Code Online (Sandbox Code Playgroud)

命名事件等待句柄时,该名称将在操作系统中的所有进程之间共享.因此,为了避免冲突的可能性,请使用guid作为名称(上面的"SHARED_BY_ALL_PROCESSES").

  • 像这样使用它:`if(waitHandle.WaitOne()))try {...} finally {waitHandle.Set();}`如果有异常 (3认同)

Jak*_*rew 13

C#中的互斥锁可以在多个进程之间共享.以下是写入单个文件的多个进程的示例:

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

您需要确保为互斥锁提供一个唯一的名称,该名称将在整个系统中共享.

另外阅读:

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