C# 多线程操作同一个文件,如何避免冲突

1 使用lock

经测试,依然存在线程冲突
private static object locker = new object();
……
lock (locker)
{
		string bText = File.ReadAllText(FPath);
		return bText;
}
……
lock (locker)
{
		File.WriteAllText(FPath, aContent);
}

2 使用ReaderWriterLockSlim

经测试,依然存在线程冲突
private static ReaderWriterLockSlim FSlim = new ReaderWriterLockSlim();
……
FSlim.EnterReadLock();
string bText = File.ReadAllText(FPath);
FSlim.ExitReadLock();
return bText;
……
FSlim.EnterWriteLock();
File.WriteAllText(FPath, aContent);
FSlim.ExitWriteLock();

3 使用Mutex

经测试,可在某种程度上解决冲突,测试3个小时依然出现冲突,注意Mutex的初始化时的参数“Global”和“Local”
https://learn.microsoft.com/zh-cn/dotnet/api/system.threading.mutex.-ctor?view=net-8.0#system-threading-mutex-ctor(system-boolean-system-string)
private static Mutex fileMutex = new Mutex(false, "Global\\UniqueName_For_File_Access_Mutex");
……
try
{
		// 尝试获取Mutex,如果获取不到,会等待直到超时
		fileMutex.WaitOne();
		string bText = File.ReadAllText(FPath);
		return bText;
}
catch (Exception e)
{
		return e.Message;
}
finally
{
		// 释放Mutex,让其他线程可以访问
		fileMutex.ReleaseMutex();
}
……
try
{
		// 尝试获取Mutex,如果获取不到,会等待直到超时
		fileMutex.WaitOne();
		File.WriteAllText(FPath, aContent);
}
catch (Exception e)
{
		string bMessage = e.Message;
}
finally
{
		// 释放Mutex,让其他线程可以访问
		fileMutex.ReleaseMutex();
}

你可能感兴趣的:(c#,开发语言)