该进程无法访问此文件,因为它正被c#中的另一个进程使用

时间:2017-11-05 08:09:33

标签: c# multithreading locking streamwriter

我正在尝试使用1个锁定对象并尝试使用StreamWriter在锁定下的两个不同位置写入同一文件,但是我收到错误:

该进程无法访问文件'filename',因为它正由另一个进程使用。

定义了锁定对象,我使用了一个静态对象:

protected static Object Semaphore = new Object();

if(x != null)
{
    lock (Semaphore)
    {
        using (StreamWriter sw = new StreamWriter(fileName))
        {

            sw.WriteLine(a + "," + b + "," + c);
            sw.Close();
            sw.Flush();
        }
    }

}

在此之后:

if(y != null)
{
    lock (Semaphore)
    {
        using (StreamWriter sw1 = new StreamWriter(fileName))
        {

            sw1.WriteLine(a + "," + b + "," + c);
            sw1.Close();
            sw1.Flush();
        }
    }
}

我错过了什么?谢谢。

1 个答案:

答案 0 :(得分:0)

该文件仍标记为"正在使用"通过您的操作系统 - 错误消息不是来自您的信号量机制。通常我认为信号量与使用相结合应该关闭文件。

两个代码部分中的哪一个会引发您的异常?你在其他地方打开它吗?

顺便说一下。请复制并粘贴/修复您的代码 - 您的粘贴演示代码将无法运行 - 关闭的Textwriters无法刷新!

MY testcase - 尚未线程化:

internal class Program
{
    public static void DoStuff()
    {
        Directory.CreateDirectory(Path.GetDirectoryName(fileName));

        if (x != null)
        {
            lock (lockObj)
            {
                WriteStuff();
            }
        }

        if (y != null)
        {
            lock (lockObj)
            {
                WriteStuff();
            }
        }
    }


    private static string fileName = "C:\\temp\\tempfile.txt";
    private static object lockObj = new object();
    private static string x = "";
    private static string y = "";

    static void Main(string[] args)
    {
        DoStuff();
    }

    static void WriteStuff()
    {
        using (StreamWriter sw1 = new StreamWriter(fileName))
        {
            sw1.WriteLine("irrelevant");
        }
    }
}