C# 在未处理的异常处理程序中异步写入文件
我正在为未处理的异常事件编写处理程序,我们将把异常转储到文件中,然后发送到服务器进行进一步分析。现在,我想将异常保存到一个文件中,并在下次运行时显示它。我正在从处理程序调用一个函数,该函数具有以下实现:C# 在未处理的异常处理程序中异步写入文件,c#,async-await,windows-10-universal,C#,Async Await,Windows 10 Universal,我正在为未处理的异常事件编写处理程序,我们将把异常转储到文件中,然后发送到服务器进行进一步分析。现在,我想将异常保存到一个文件中,并在下次运行时显示它。我正在从处理程序调用一个函数,该函数具有以下实现: public async Task WriteDataAsync(string filename, string data) { var file = await this.storageFolder.CreateFileAsync(filename, CreationCollision
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();
}
我还想在写之前创建一个文件。但是,数据没有再次写入文件我认为您可以使用FileMode.openor创建:
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);
};
}
在这种情况下,这种行为的原因是什么。我想这与异步/等待方法的工作方式有关
你的猜测是对的。当我们调用wait
方法时,它将控制权返回给异步方法的调用者。在此上下文中,控件将最终返回到Windows运行时。通常在触发UnhandledException
事件后,Windows运行时将终止应用程序。因此,应用程序可能在异步操作完成其工作之前终止。这可能会导致你所看到的行为
在该上下文中是否有其他异步写入文件的解决方案?我有一个可行的解决方案,就是在这种情况下同步运行函数
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();
}
对于这种情况,我们通常需要延迟异步操作,如或。然而,在
未处理的异常事件中没有这样的事情。在这种情况下,您的解决方案是正确的,我们可以同步执行这些操作以避免此问题。您可以参考此博客:以处理未处理的异常。它也使用此解决方案。能否显示所有相关代码,即事件处理程序?应用程序是否可能在写入数据之前退出?找到了与问题描述不同的解决方案,但您给出的答案满足了我的问题。@MaxiKing您找到的其他解决方案是什么?我也很好奇。您能分享它吗?这样它就可以帮助其他人了?解决方案是将事件处理程序的主体放入task和AutoResetEvent.Set()中。在处理程序的正文中,输入了AutoReset事件WaitOne()。