多线程 - 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();
}

多线程 - C# 中的共享文件访问

是否可以

将此方法标记为一次允许一个线程?然后,一旦上一个调用完成,将进行下一个调用。

将此属性放在类上:

[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.EnterMonitor.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由所有线程共享。