有时候某些线程读配置,很简单的用FileStream file = new FileStream("1.txt", FileMode.Open);
就打开文件了,然后开始读了。
而习惯了直接单开一个线程去读文件这种情况,很容易就遇到了文件正在读的时候,然后就冲突了……
下面写了一个简单的读写过程:
static void ReadFunction()
{
Console.WriteLine(DateTime.Now.ToString() + " " + "ReadFunction");
lockSlim.EnterReadLock();
try
{
FileStream file = new FileStream("1.txt", FileMode.Open, FileAccess.Read);
Console.WriteLine(DateTime.Now.ToString() + " " + "file open ok");
byte[] bytearray = new byte[1024];
file.Read(bytearray, 0, (int)file.Length);
Console.WriteLine(DateTime.Now.ToString() + " " + Encoding.UTF8.GetString(bytearray));
Thread.Sleep(5000);
file.Dispose();
Console.WriteLine(DateTime.Now.ToString() + " " + "file dispose ok");
}
finally
{
lockSlim.ExitReadLock();
}
}
static void WriteFunction()
{
Console.WriteLine(DateTime.Now.ToString() + " " + "WriteFunction");
lockSlim.EnterWriteLock();
try
{
FileStream file = new FileStream("1.txt", FileMode.Open, FileAccess.ReadWrite);
Console.WriteLine(DateTime.Now.ToString() + " " + "file open ok");
byte[] bytearray = new byte[1024];
int length = file.Read(bytearray, 0, (int)file.Length);
bytearray[length - 1] += 1;
file.Seek(0, SeekOrigin.Begin);
file.Write(bytearray, 0, length);
Console.WriteLine(DateTime.Now.ToString() + " " + Encoding.UTF8.GetString(bytearray));
Thread.Sleep(5000);
file.Dispose();
Console.WriteLine(DateTime.Now.ToString() + " " + "file dispose ok");
}
finally
{
lockSlim.ExitWriteLock();
}
}
static ReaderWriterLockSlim lockSlim = new ReaderWriterLockSlim();
static void Main(string[] args)
{
new Thread(ReadFunction).Start();
Thread.Sleep(100);//避免线程调度先启动WriteFunction
new Thread(ReadFunction).Start();
new Thread(WriteFunction).Start();
new Thread(ReadFunction).Start();
Console.ReadLine();
}
}
结果如下:
注意:
ReaderWriterLockSlim 是分读和写的,如果是读过程,要加读锁EnterReadLock
,并且使用FileStream file = new FileStream("1.txt", FileMode.Open, FileAccess.Read);
进行读,一定要加FileAccess
字段,不然要提示另一线程正在访问对象这种异常的。
微软NetFramework参考资料:
ReaderWriterLockSlim Class