Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在未处理的异常处理程序中异步写入文件_C#_Async Await_Windows 10 Universal - Fatal编程技术网

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);
}
问题是,如果文件不存在,则会创建该文件,但异常数据不会保存到该文件中。但是,如果文件存在,则数据会正确保存。此函数在不用于处理未处理的异常时工作。
在这件事上我有两个问题

  • 在这种情况下,这种行为的原因是什么。我想这与async/await方法的工作方式有关,这在正常情况下是可以的,但在处理这种上下文中的异常时有问题
  • 在该上下文中是否有其他异步写入文件的解决方案?我有一个可行的解决方案,就是在这种情况下同步运行函数

    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()。