多进程读写一个文件我有一个txt文件ABC.txt,会被多个进程读写。因此,当一个进程正在读写文件ABC.txt时,文件ABC.txt必须被锁定,这样其他进程就不能对其进行读写。我知道枚举System.IO.FileShare可能是处理此问题的正确方法。但是我用另一种方式,我不确定它是否正确。以下是我的解决方案。我在文件夹中添加了另一个文件Lock.txt。在我可以读取或写入文件ABC.txt之前,我必须能够读取文件Lock.txt。在读取或写入文件ABC.txt后,我??必须释放该函数。下面是代码。#region输入锁文件流lockFileStream=null;boollockEntered=false;while(lockEntered==false){try{lockFileStream=File.Open("Lock.txt",FileMode.Open,FileAccess.Read,FileShare.None);锁定输入=真;}赶上(异常){Thread.Sleep(500);}}#endregion#region完成工作//读取或写入文件ABC.txt//读取或写入其他文件#endregion#region释放锁try{if(lockFileStream!=null){lockFileStream.处置();}}catch{}#endregion在我的电脑上,这个解决方案似乎工作正常,但我仍然无法判断它是否合适。编辑:多个进程,而不是同一进程中的多线程。C#名称EventWaitHandle是去的地方。在每个要使用该文件的进程中创建一个等待句柄实例,并为其指定一个由所有此类进程共享的名称。EventWaitHandlewaitHandle=newEventWaitHandle(true,EventResetMode.AutoReset,"SHARED_BY_ALL_PROCESSES");然后,当访问文件时等待waitHandle并完成文件处理,设置它以便队列中的下一个进程可以访问它。waitHandle.WaitOne();/*进程文件*/waitHandle.Set();命名事件等待句柄时,该名称将在操作系统中的所有进程之间共享。因此,为避免发生冲突的可能性,请使用guid作为名称(上面的“SHARED_BY_ALL_PROCESSES”)。C#中的互斥量可以在多个进程之间共享。下面是多个进程写入单个文件的示例:File.AppendAllText(outputFilePath,theFileText);互斥体.ReleaseMutex();您需要确保为互斥量提供一个唯一的名称,该名称将在整个系统中共享。另请阅读:http://www.albahari.com/threading/part2.aspx#_Mutex您的解决方案很容易出错。您基本上是在实施双重检查锁定(http://en.wikipedia.org/wiki/Double-checked_locking),这可能非常不安全。更好的解决方案是引入线程隔离,只有一个线程访问文件,并通过一个队列读取,该队列放置来自其他线程的读取或写入请求(当然,队列受线程访问的互斥锁保护)或线程通过同步设备(锁定部分、突变体等)或使用其他一些文件访问逻辑来同步自身(例如,System.IO.FileShare在这里有一些影响。)C#有一个内置锁,您可以通过创建一个所有线程都可以访问的静态对象来使用它:privatestaticobjectlockObject{get;set;}publicstaticobjectLockObject{get{returnlockObject??lockObject=newobject();}}voidYourMethod(){lock(LockObject)//所有其他线程将等待y{using(varlockFileStream=File.Open("Lock.txt",FileMode.Open,FileAccess.Read,FileShare.None)){//对文件做你需要做的事。这为您的问题创建了一个线程安全方法。如果是我,我会安装类似SQLServerCompactEdition的东西来读/写这些数据。但是,如果您希望能够锁定对多个进程之间共享的资源的访问,则需要使用Mutex或Semaphore。Mutex类是操作系统级锁定机制的.Net包装器。同步原语概述以上就是C#学习教程:多进程读写文件分享的全部内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注。本文来自网络收藏,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处:
