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

本文关键字:文件 异步 未处理 异常处理程序 | 更新日期: 2023-09-27 17:58:04

我正在为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. 在这种情况下,是否有其他异步写入文件的解决方案?我有一个可行的解决方案,就是在这种情况下使run函数同步。

    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();
    }
    

    在写作之前,我也有一个创建文件的想法。但是,数据没有再次写入文件。

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

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

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

在这种情况下,是否有其他异步写入文件的解决方案?我有一个可行的解决方案,就是在这种情况下使run函数同步。

对于这种情况,我们通常需要对SuspendingDeferral或BackgroundTaskDeferral等异步操作进行延迟。然而,在UnhandledException事件中却没有这样的东西。在这种情况下,您的解决方案是正确的,我们可以同步进行这些操作以避免此问题。您可以参考以下博客:处理Windows应用商店应用程序中错误的策略,以处理未处理的异常。它也使用这个解决方案。

我认为您可以使用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);
        };
    }