C# 为什么我无法写入此文件?
我在C#中编写了一个异步方法来写入文件,但是我不断得到以下异常: 进程无法访问该文件 “C:\XXX\XXX\XXX\XXX\EventBuffer.txt”,因为它正被 另一个过程 我已经看了一些类似的问题,这些问题已经发布在上了,但是看起来我的问题的原因是不同的 我使用了一个进程监视器来查看哪些进程正在尝试访问文件所在的目录,但唯一尝试访问它的进程是我正在调试的进程(很快将发布调试进程窗口的一个片段) 这并不是说在上次访问时关闭文件之前就尝试了文件访问,因为当我第一次尝试访问文件时,会出现异常。我尝试在StreamWriter实例化后实现延迟,以防尝试写入方法,之前我没有使用using块,而是使用其dispose方法处理对象,但在一个类似的问题中,这解决了问题C# 为什么我无法写入此文件?,c#,file,asynchronous,C#,File,Asynchronous,我在C#中编写了一个异步方法来写入文件,但是我不断得到以下异常: 进程无法访问该文件 “C:\XXX\XXX\XXX\XXX\EventBuffer.txt”,因为它正被 另一个过程 我已经看了一些类似的问题,这些问题已经发布在上了,但是看起来我的问题的原因是不同的 我使用了一个进程监视器来查看哪些进程正在尝试访问文件所在的目录,但唯一尝试访问它的进程是我正在调试的进程(很快将发布调试进程窗口的一个片段) 这并不是说在上次访问时关闭文件之前就尝试了文件访问,因为当我第一次尝试访问文件时,会出现异
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)
{
}
}
我在其他类中使用了几乎相同的方法,这些方法不会引起相同的问题,这让我非常恼火
未从循环中调用该方法。调用在seprate静态类中通过以下方法完成:
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));
}
错误是不言自明的,您使用的是
ASYNC
方法(可能是在循环中),当您的第一个任务尚未完成时,它会运行(即写入文件),这就是为什么您会出现该错误
你试过用同步方法写作吗?如果需要定期写入文件(即日志),请使用日志框架
我建议使用
log4net
这是最好的方法之一。请发布UpdateEventBufferFile
的调用站点,了解如何使用此方法很重要。你有一个调用方法的循环吗?为什么要重新发明轮子?使用日志框架。你能在示例控制台应用程序中重现该问题吗?不相关:public async static void
建议为public async static Task
,因为该方法不是事件处理程序。为什么要将异步方法包装在任务中。Run?”(可能在循环中)”是一个强有力的假设,应该首先澄清。“这是最好的。”-取决于你如何定义“最好的”“.这充其量是自以为是的…我也这么认为,但事实并非如此,为了审判这件事,我注释掉了所有其他内容并保留了using块,在第一次尝试执行using块时,我得到了异常,因此在此之前没有对文件进行任何操作,我可能假设,但问题的关键在于,错误的发生是由于文件仍在处理某些任务,而不是从循环中调用该文件。