除非使用断点逐步执行,否则ReadTextAsync返回null

时间:2019-03-04 07:59:36

标签: c# uwp

在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;
    }
}

1 个答案:

答案 0 :(得分:1)

试图解释@HenkHolterman在评论中的含义,

没有返回类型(void)的

asyncasync Task不能很好地配合Exception和throwable,它们仅适用于异步事件侦听器,而不适用于{{1 }}或async Task<T>,它们具有返回类型,如果有任何异常,则该异常将通过返回类型传递给调用方。您也可以参考here来了解有关异步和等待的最佳做法

我的建议是

  1. 使async T方法具有返回类型,例如asyncbool,以指示该方法是否成功完成了自己的工作
  2. 您正在UWP上执行此操作,对吗?我不完全记得(或什至不知道)UWP如何处理存储/磁盘I / O请求,但是您确定您的代码/应用程序已经具有所需的权限吗?
  3. 我不知道底层方法等等,但是如果Task<bool>的{​​{1}}无法输出错误等,请尝试使用{{1 }}命名空间。这可能是您真正的问题,也可能不是您的真正问题,即没有异常打印到输出窗口

还试图解释@MichaelRandal的意思(也来自评论)

如果我可以在评论中引用断点,那么您已经做出了“非常大的要求”,因此,我们希望您详细说明,例如提供更多信息,例如堆栈输出,断点输出和这样,因此任何想要回答或贡献的人都不必继续要求提供所需的信息