【发布时间】:2016-04-07 09:23:28
【问题描述】:
我有用于购物的 Windows 商店应用程序。我创建了日志文件来管理错误。但有时我在文件中附加数据时会出现以下错误。
这是我的代码:
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))
我不明白为什么会抛出这个错误。有人可以建议我如何解决这个问题吗?
【问题讨论】:
-
async void应该仅用于事件处理程序或类似功能,否则您无法检测到该方法是否已完成。您可能在执行前一个调用时尝试写入文件。将签名更改为async Task并等待日志方法,例如await LogError...。无论如何,请发布完整的异常,包括调用堆栈。您可以致电Exception.ToString()获取此信息。 -
@PanagiotisKanavos 是的,有时它会调用 write 甚至最后一次调用正在执行。您能否建议我有关如何使用“异步任务”的链接或想法?
-
@PanagiotisKanavos 如果我们在调用时使用“await”LogError,我们需要在包含此调用的所有方法的签名中添加“async”。并且 LogError 调用是在几乎方法的 try-catch 中。在所有方法中添加“异步”是否很好?
-
async什么都不做。它只是编译器的标记。await实际上做了一些事情——存储当前线程的执行上下文,释放线程,等待异步操作完成,然后将上下文恢复到原始线程。 -
如果您不想等待日志操作完成,您可以使用 ActionBlock 在后台线程中按顺序执行所有写入,或者将其发布到 ConcurrentQueue 并进行单独的线程轮询它并写入任何日志消息。不过,也许您应该找到一个已经这样做的日志库
标签: c# windows-store-apps