在未处理的异常处理程序中异步写入文件

时间:2016-07-21 07:48:22

标签: c# async-await windows-10-universal

我正在为Unhandled Exception事件编写处理程序,我们将异常转储到文件中,然后发送到服务器进行进一步分析。现在我想将异常保存到文件中并在下次运行时显示它。从处理程序我调用一个函数,它有这样的实现:

public async Task WriteDataAsync(string filename, string data)
{
    var file = await this.storageFolder.CreateFileAsync(filename, CreationCollisionOption.ReplaceExisting);
    await FileIO.WriteTextAsync(file, data);
}

问题是如果文件不存在则会创建,但异常数据不会保存到文件中。但是,如果文件存在,则数据会正确保存。当此函数未用于处理未处理的异常时,此函数有效 我在这件事上有两个问题。

  1. 在这种情况下出现这种行为的原因是什么。我想这与async / await方法的工作方式有关,这对于正常情况是正常的,但在此上下文中处理异常时会遇到问题。
  2. 是否有其他解决方案在该上下文中异步写入文件?我有一个有效的解决方案,就是在这种情况下同步运行功能。

    public void WriteDataAsync(string filename, string data)
    {
        var fileTask = this.storageFolder.CreateFileAsync(filename, CreationCollisionOption.ReplaceExisting).AsTask();
        var writingToFileTask = FileIO.WriteTextAsync(fileTask.Result, data).AsTask();
        writingToFileTask.Wait();
    }
    

    我还想在写作之前创建文件。但是,数据未再次写入文件。

2 个答案:

答案 0 :(得分:0)

  

在这种情况下出现这种行为的原因是什么。我想这与async / await方法的工作方式有关。

你的猜测是正确的。当我们调用await方法时,它会将控制权返回给异步方法的调用者。在此上下文中,控件最终将返回到Windows运行时。通常在UnhandledException事件被触发后,Windows运行时将终止该应用程序。因此,在异步操作完成其工作之前,应用程序可能会被终止。这可能会导致你所看到的行为。

  

是否有其他解决方案在该上下文中异步写入文件?我有一个有效的解决方案,就是在这种情况下同步运行功能。

对于这种情况,通常我们需要推迟异步操作,如SuspendingDeferralBackgroundTaskDeferral。但是UnhandledException事件中没有这样的事情。在这种情况下,您的解决方案是正确的,我们可以同步进行这些操作以避免此问题。您可以参考此博客:Strategies for Handling Errors in your Windows Store Apps来处理未处理的异常。它也使用这个解决方案。

答案 1 :(得分:0)

我认为你可以使用FileMode.OpenOrCreate:

    public async Task WriteDataAsync(string fileName, string data)
    {
        byte[] text = Encoding.Unicode.GetBytes(data);

        using (var stream = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.Write))
        {
            await stream.WriteAsync(text, 0, text.Length);
        };
    }