多线程 - C# 中的共享文件访问
本文关键字:共享文件 访问 多线程 | 更新日期: 2023-09-27 18:33:31
我有一个名为WriteMsg的方法,它同时被多个线程调用,但我得到一个异常java.nio.channels.OverlappingFileLockException。 我该如何解决这个问题? 我的代码类似于下面给出的。
public void WriteMsg(string Msg)
{
Mutex objMutex = new Mutex(false, "ThreadLock");
objMutex.WaitOne();
using (StreamWriter sw = new StreamWriter(sPathName, true))
{
sw.WriteLine(Msg);
sw.Flush();
sw.Close();
}
objMutex.ReleaseMutex();
objMutex.Close();
}
将此方法标记为一次允许一个线程?然后,一旦上一个调用完成,将进行下一个调用。
将此属性放在类上:
[MethodImpl(MethodImplOptions.Synchronized)]
和 using 语句:
using System.Runtime.CompilerServices;
哦,伙计,你甚至不知道你用什么语言?
代码标记为 C#。错误消息是...java.nio.channels.OverlappingFileLockException. 猜猜怎么着 - Java 不是 C#。Yopur代码是C#,但例外是Java-为什么呢?我强烈认为我们在这里看不到整个故事。C# 代码不会引发 Java 异常。
无论如何,关键是 - 只是不要同时从多个线程访问同一个文件 y 意味着某种锁定机制。你使用互斥体的方法听起来很明智(但是鉴于你在代码中使用 C#,Java 在哪里进入游戏?我会开始使用ProcessExplorer并找出 - 啊 - 是什么锁定了文件。可能不是作家吗?难道是READS是别的东西吗?如果它不在进程或其他什么,那么你的互斥体将无济于事。尝试/捕获等待+重试可能会。
可是:
检查互斥锁。你在方法中创建互斥锁。你永远不会等待。您需要在方法调用之间保持互斥锁,并确保所有调用都使用相同的互斥锁。现在你说"只有最低的号码进入",但你给了eveyone一张相同号码的票。互斥必须在所有调用方之间共享,因此不能在方法中定义。根据类设计,您需要一个实例变量、静态变量、字典 opf 互斥体(按路径键(。
1(假设你只是希望所有WriteMsg
调用一个接一个地运行,你不需要弄乱互斥,你可以使用C#的lock
语句,它包装了对Monitor.Enter
和Monitor.Exit
的调用。
2(由于您在StreamWriter上使用using
,因此无需手动刷新和关闭。
所以你的方法可以看起来像这样:
private object _lockObject = new object(); // shared by all threads.
public void WriteMsg(string Msg)
{
lock (_lockObject)
{
using (StreamWriter sw = new StreamWriter(sPathName, true))
{
sw.WriteLine(Msg);
}
}
}
在每次调用此函数时创建新Mutex
有什么意义?每个线程都单独Mutex
...使Mutex
由所有线程共享。