我正在为Unhandled Exception事件编写处理程序,我们将异常转储到文件中,然后发送到服务器进行进一步分析。现在我想将异常保存到文件中并在下次运行时显示它。从处理程序我调用一个函数,它有这样的实现:
public async Task WriteDataAsync(string filename, string data)
{
var file = await this.storageFolder.CreateFileAsync(filename, CreationCollisionOption.ReplaceExisting);
await FileIO.WriteTextAsync(file, data);
}
问题是如果文件不存在则会创建,但异常数据不会保存到文件中。但是,如果文件存在,则数据会正确保存。当此函数未用于处理未处理的异常时,此函数有效 我在这件事上有两个问题。
是否有其他解决方案在该上下文中异步写入文件?我有一个有效的解决方案,就是在这种情况下同步运行功能。
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();
}
我还想在写作之前创建文件。但是,数据未再次写入文件。
答案 0 :(得分: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);
};
}
答案 1 :(得分:0)
在这种情况下出现这种行为的原因是什么。我想这与async / await方法的工作方式有关。
你的猜测是正确的。当我们调用await
方法时,它会将控制权返回给异步方法的调用者。在此上下文中,控件最终将返回到Windows运行时。通常在UnhandledException
事件被触发后,Windows运行时将终止该应用程序。因此,在异步操作完成其工作之前,应用程序可能会被终止。这可能会导致你所看到的行为。
是否有其他解决方案在该上下文中异步写入文件?我有一个有效的解决方案,就是在这种情况下同步运行功能。
对于这种情况,通常我们需要推迟异步操作,如SuspendingDeferral或BackgroundTaskDeferral。但是UnhandledException
事件中没有这样的事情。在这种情况下,您的解决方案是正确的,我们可以同步进行这些操作以避免此问题。您可以参考此博客:Strategies for Handling Errors in your Windows Store Apps来处理未处理的异常。它也使用这个解决方案。