为什么我无法写入此文件?

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

标签: c# file asynchronous

我在C#中写了一个Async方法来写一个文件,但是我继续得到以下异常:

  

该进程无法访问该文件   'C:\ XXX \ XXX \ XXX \ XXX \ EventBuffer.txt'因为正在使用它   另一个过程。

我已经查看了已在帖子上发布的类似问题,例如this onethis one,但似乎问题的原因不同。

我使用进程监视器来查看哪些进程正在尝试访问文件所在的目录,但尝试访问它的唯一进程是我正在调试的进程(将在调试进程窗口后很快发布一个代码段) )。

在上次访问时关闭文件并不是在尝试访问文件,因为我第一次尝试访问文件时可以获得异常。在尝试使用write方法实例化 StreamWriter 之后,我试图实现延迟,我以前没有使用使用块并且正在使用使用这是处理方法,但在一个类似的问题中,这解决了这个问题。

public static async void UpdateEventBufferFile(EventDetails EventDtls)
{
    string line;

    try
    {
        using (StreamWriter EventBufferFile = new StreamWriter(FilePath, true)) // creates the file
        {
            //All barcode data space sperated for split detection
            line = EventDtls.SiteID + " " + EventDtls.McID + " " + EventDtls.EventID + " "
                 + EventDtls.EventDT + " " + EventDtls.AdditionalInfo;
            await Task.Run(() => LogFileManager.SystematicLog(" Events " + line + " added to buffer file", " BufferFileWriter.cs"));
            await EventBufferFile.WriteLineAsync(line); //no need for new line char WriteLine does that
            await EventBufferFile.FlushAsync();

            //The using block is suffice to dispose of the object the below is no longer required
            //EventBufferFile.Dispose();
            //EventBufferFile.Close();
            //EventBufferFile = null;
        }
    }
    catch (Exception ex)
    {    
    }
}

我在其他类中使用了几乎相同的方法,这些方法不会引起同样的问题,这让我很烦恼。

未在循环内调用该方法。调用在以下方法中的单独静态类中完成:

    public static void AddCentralEvents(int SiteID, int McID, int EventID, DateTime EventDT, string AdditionalInfo) 
    {
        EventDetails EventDetailsObj = new EventDetails();
        EventDetailsObj.SiteID = SiteID;
        EventDetailsObj.McID = McID;
        EventDetailsObj.EventID = EventID;
        EventDetailsObj.EventDT = EventDT;
        EventDetailsObj.AdditionalInfo = AdditionalInfo;

        Task.Run(() => BufferFileWriter.UpdateEventBufferFile(EventDetailsObj));

    }

1 个答案:

答案 0 :(得分:-2)

错误是自我解释的,你使用ASYNC方法(也许在一个循环中),而你的第一个任务没有完成它的运行(即写入文件),这就是你最终的结果那个错误。

您是否尝试使用同步方法编写?如果您需要定期写入文件(即日志记录),请使用日志记录框架。

我建议使用log4net这是'最好的'之一。