-1

我有一个名为 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();
}
4

4 回答 4

0

您是否可以将此方法标记为一次允许一个线程?然后,一旦前一个呼叫完成,就会进行下一个呼叫。

将此属性放在您的班级上:

[MethodImpl(MethodImplOptions.Synchronized)]

和使用语句:

using System.Runtime.CompilerServices;
于 2012-05-09T06:40:49.710 回答
0

哦,伙计,你甚至不知道你使用什么语言?

代码标记为 C#。错误消息是... java.nio.channels.OverlappingFileLockException。你猜怎么着——Java 不是 C#。Yopur 代码是 C#,但 Java 是个例外——怎么会?我强烈认为我们在这里看不到整个故事。C# 代码不会引发 Java 异常。

无论如何,重点是——不要同时从多个线程访问同一个文件,这意味着某种锁定机制。您使用 Mutex 的方法听起来很明智(但是鉴于您 CLELARY 在代码中使用 C#,Java 会在哪里进入游戏?)我会开始使用 ProcessExplorer 并找出 - 啊 - 什么是锁定文件。可能不是作者?READS 可能是其他东西吗?如果它超出了进程或其他原因,那么您的 Mutex 将无济于事。带有等待 + 重试的 try / catch 可能。

那说:

检查你的互斥锁。您在方法中创建互斥锁。WaitOne 永远不会等待。您需要在方法调用之间保留 Mutex,并确保所有调用都使用相同的 Mutex。现在你说“只有最低的号码才能进去”,但你给了每个人一张相同号码的票。Mutex 必须在所有调用者之间共享,因此不能在方法中定义。根据类设计,您需要一个实例变量、静态变量、字典 opf 互斥锁(由路径键控)。

于 2012-05-09T06:42:42.753 回答
0

1)假设您只想让所有WriteMsg调用一个接一个地运行,您不需要弄乱互斥锁,您可以使用 C# 的lock语句,它包装了对Monitor.Enterand的调用Monitor.Exit

2)由于您在usingStreamWriter 上使用,因此无需手动刷新和关闭。

所以你的方法看起来像这样:

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);
        }

     }
}
于 2012-05-09T06:44:54.430 回答
0

Mutex在每次调用这个函数时创建一个新的有什么意义?每个线程都是独立的Mutex......让Mutex所有线程共享。

于 2012-05-09T06:45:11.990 回答