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").
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