我在C#中写了一个Async方法来写一个文件,但是我继续得到以下异常:
该进程无法访问该文件 'C:\ XXX \ XXX \ XXX \ XXX \ EventBuffer.txt'因为正在使用它 另一个过程。
我已经查看了已在帖子上发布的类似问题,例如this one和this 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));
}
答案 0 :(得分:-2)
错误是自我解释的,你使用ASYNC
方法(也许在一个循环中),而你的第一个任务没有完成它的运行(即写入文件),这就是你最终的结果那个错误。
您是否尝试使用同步方法编写?如果您需要定期写入文件(即日志记录),请使用日志记录框架。
我建议使用log4net
这是'最好的'之一。