【问题标题】:Why am I unable to write to this file?为什么我无法写入此文件?
【发布时间】:2018-02-26 17:00:19
【问题描述】:

我在 C# 中编写了一个异步方法来写入文件,但是我不断收到以下异常:

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

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

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

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

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

    }

【问题讨论】:

  • 请张贴UpdateEventBufferFile的调用站点,了解您如何使用此方法很重要。您是否有一个正在调用该方法的循环?
  • 为什么要重新发明轮子?使用日志框架。
  • 您能否在示例控制台应用程序中重现该问题?
  • 不相关:public async static void 建议为 public async static Task,因为该方法不是事件处理程序。
  • 为什么要在 Task.Run 中包装异步方法?

标签: c# file asynchronous


【解决方案1】:

错误是不言自明的,您正在使用ASYNC 方法(可能在循环中),而当您的第一个任务尚未完成时,它正在运行(即写入文件),这就是您最终遇到该错误的原因.

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

我建议使用 log4net 它是“最好的”之一。

【讨论】:

  • "(可能在循环中)" 是一个强有力的假设,应该首先澄清。
  • “这是最好的。” - 取决于您如何定义“最佳”。这充其量是自以为是...
  • 我也是这么想的,但事实并非如此,为了试用这个,我注释掉了其他所有内容并保留了 using 块,第一次尝试 using 块是在我得到异常时执行,因此在此之前没有对文件进行任何操作
  • 我可能已经猜到了,但答案的关键是由于文件仍在处理某些任务而发生错误
  • 它不是从循环中调用的。
猜你喜欢
  • 2021-10-24
  • 1970-01-01
  • 2015-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-20
  • 2019-08-01
  • 1970-01-01
相关资源
最近更新 更多