C# ReadTextAsync返回null,除非使用断点单步执行

C# ReadTextAsync返回null,除非使用断点单步执行,c#,uwp,C#,Uwp,在UWP中,我使用WriteTextAsync写入20K ascii文本文件,然后使用ReadTextAsync读取同一文件。 当我使用断点运行时,通过ReadRawTextFromFile单步执行,它工作正常。 当我在没有断点的情况下正常运行时,ReadTextAsync返回空值。 我没有任何例外。 我该怎么做才能让它读取文件 // This is for writing the RawText private async void WriteRawTextToFile(string fnam

在UWP中,我使用WriteTextAsync写入20K ascii文本文件,然后使用ReadTextAsync读取同一文件。 当我使用断点运行时,通过ReadRawTextFromFile单步执行,它工作正常。 当我在没有断点的情况下正常运行时,ReadTextAsync返回空值。 我没有任何例外。 我该怎么做才能让它读取文件

// This is for writing the RawText
private async void WriteRawTextToFile(string fname, string textToWrite)
{
    try
    {
        StorageFolder localFolder = ApplicationData.Current.LocalFolder;
        StorageFile localFile = await localFolder.CreateFileAsync(fname, CreationCollisionOption.ReplaceExisting);
        await FileIO.WriteTextAsync(localFile, textToWrite);
    }
    catch(Exception e)
    {
        Console.WriteLine($"WriteRawTextToFile Exception: '{e}'");
    }
}

private string TextFromFile;    // to get back from the file read
private async void ReadRawTextFromFile(string fname, string defaultString)
{
    try
    {
        StorageFolder localFolder = ApplicationData.Current.LocalFolder;
        StorageFile localFile = await localFolder.GetFileAsync(fname);
        TextFromFile = await FileIO.ReadTextAsync(localFile);        // get Text from the file
    }
    catch (Exception e)
    {
        Console.WriteLine("Exception: " + e.ToString());
        TextFromFile = defaultString;
    }
}

试图解释@HenkHolterman在评论中的意思

async和不具有返回类型void的async Task与Exception和throwable的关系不太好。它们仅适用于异步事件侦听器,而不适用于具有返回类型的async Task或async t,如果存在任何异常,则会通过返回类型将异常传递给调用方。您还可以参考有关async和Wait的最佳实践

我的建议是

例如,使异步方法具有返回类型、bool或Task,以指示该方法是否成功完成其任务 你是在UWP上做的,对吗?我记不清或者甚至不知道UWP是如何处理存储/磁盘i/O请求的,但您确定您的代码/应用程序已经具有所需的权限吗? 我不知道底层的方法等等,但是如果控制台中的WriteLines不能用于输出错误等等,请尝试使用System.Diagnostics命名空间中的Debug.WriteLines。这可能是您的真正问题,也可能不是关于输出窗口中没有打印出异常的问题 还试图从评论中解释@MichaelRandal的意思


如果我可以引用评论中关于断点的话,您提出了一个“非常声明”,正因为如此,我们希望您详细说明,例如提供更多信息,可能是堆栈输出、断点输出等等,因此,任何想要回答或贡献的人都不必不断询问所需信息

您是如何证明这一点的,特别的声明需要特别的证明。不要使用async void。您如何验证您从ReadTextAsync返回null?您的问题中没有验证这一点的代码。请确保不要将TextFromFile为null与ReadTextAsync返回的null混淆,因为在计时方面,因为您使用了async void,所以在尝试读取TextFromFile时,ReadTextAsync可能尚未执行或返回。另外,async void与fire and forget相同,您显然希望从中获得结果,因此您不能忘记它,在这种情况下,async void是完全错误的,很可能也是您的问题的原因。在这里,异步任务方法{}可以。这是一个异步void方法{},几乎在任何地方都应该避免。谢谢,这太棒了-我把它做成了一个任务,或者说所有的任务都由事件处理程序来完成,它的工作和预期的一样。现在我明白了为什么async void没有用了。