我有购物的Windows商店应用程序。我创建了Logfile来管理错误。但有时我在将数据附加到文件中时会出现以下错误。
这是我的代码:
public static async void logError(string pagename, string functionname, string errordescription)
{
try
{
var folder = ApplicationData.Current.LocalFolder;
var file = await folder.CreateFileAsync("errorLog.txt", CreationCollisionOption.OpenIfExists);
await FileIO.AppendTextAsync(file, string.Format("{0}Date: {1} \t PageName: {2} \t FunctionName: {3} \t ErrorDescription: {4}", Environment.NewLine, DateTime.Now, pagename, functionname, errordescription));
}
catch (Exception)
{
throw;
}
}
它写了几行,但经过一段时间后,它会抛出以下错误: 访问被拒绝。 (HRESULT异常:0x80070005(E_ACCESSDENIED))
我不知道为什么会出现这个错误。任何人都可以建议我如何解决这个问题?
答案 0 :(得分:0)
此错误的原因是您在每次LogError调用时打开/创建文件。由于这些调用可以异步并行地发生,因此打开日志文件时存在竞争条件。如果文件在第一次调用中已经打开,则第二次调用将失败并显示访问拒绝错误。
即使你修复了关于" sync"的评论中提到的问题。用法(我建议做)它无助于解决这个问题。
有几种可能的解决方案:
1)创建只打开文件一次的Logger类,然后它提供LogError调用(同时调用LogError并锁定对象或使用Mutex)。
2)锁定对象上的整个LogError或使用Mutex。因此,对LogError的所有调用都是顺序的,访问日志文件时没有竞争条件。
3)在每个LogError调用上使用唯一的文件名(例如,为名称添加新的GUID)。