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

时间:2012-05-09 06:34:34

标签: c# multithreading

我有一个名为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 个答案:

答案 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.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);
        }

     }
}

答案 3 :(得分:0)

在每次调用此函数时创建新Mutex的重点是什么?每个线程都是独立的Mutex ...让所有线程共享Mutex