【问题标题】:How to append string to file in windows store app?如何将字符串附加到 Windows 商店应用程序中的文件?
【发布时间】: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


【解决方案1】:

此错误的原因是您在每次 LogError 调用时都打开/创建了一个文件。由于这些调用可以异步和并行发生,因此在打开日志文件时存在竞争条件。如果文件已在第一次调用中打开,则第二次调用将失败并显示拒绝访问错误。

即使您修复了 cmets 中提到的关于“同步”使用的问题(我建议这样做),它也无助于解决这个问题。

有几种可能的解决方案:

1) 创建只打开一次文件的 Logger 类,然后它为 LogError 调用提供服务(同时注意 LogError 的并发调用 - 锁定对象或使用 Mutex)。

2) 将整个 LogError 锁定在一个对象上或使用 Mutex。因此,您对 LogError 的所有调用都将是顺序的,并且在访问日志文件时不会出现竞争条件。

3) 在每个 LogError 调用中使用唯一的文件名(例如,为名称添加新的 GUID)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-12
    相关资源
    最近更新 更多