我有一个名为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();
}
答案 0 :(得分:0)
您是否可以将此方法标记为一次允许一个线程? 然后,一旦完成上一个呼叫,将进行每个下一个呼叫。
将此属性放在您的课程上:
[MethodImpl(MethodImplOptions.Synchronized)]
使用声明:
using System.Runtime.CompilerServices;
答案 1 :(得分:0)
哦伙计,你甚至不知道你用的语言是什么?
代码标记为C#。错误消息是... java.nio.channels.OverlappingFileLockException。猜猜看 - Java不是C#。 Yopur代码是C#,但例外是Java - 怎么来的?我强烈认为我们在这里看不到整个故事。 C#代码不会抛出Java异常。
无论如何,重点是 - 只是不能同时从多个线程访问同一个文件,这意味着某种锁定机制。你使用Mutex的方法听起来很合理(但是在你的CLELARY在代码中使用C#的情况下java会进入游戏吗?)我会开始使用ProcessExplorer并找出 - 啊 - 什么是锁定文件。它可能不是作家吗?难道它是READS的其他东西吗?如果它处于进程或其他状态,那么你的Mutex将无济于事。尝试/捕获等待+重试可能。
这意味着:
检查您的互斥锁。你可以在方法中创建互斥锁。 WaitOne永远不会等待。你需要在方法调用之间保持互斥锁,并确保所有调用都使用相同的互斥锁。现在你说“只有最低的数字进入”,但你给eveyone一张票号相同的票。必须在所有调用者之间共享互斥锁,因此无法在方法中定义它。根据类设计,您需要一个实例变量,静态变量,字典opf互斥体(由路径键控)。
答案 2 :(得分:0)
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);
}
}
}
答案 3 :(得分:0)
在每次调用此函数时创建新Mutex
的重点是什么?每个线程都是独立的Mutex
...让所有线程共享Mutex
。