等待FileIO.ReadTextAsync给出错误(编辑:现在使用IStorageFile.OpenReadAsync)

时间:2014-06-23 14:11:25

标签: c# windows-store-apps async-await

我的项目中有这个方法。这是应该做的:
它接受一个字符串,它是我项目的Assets文件夹中文件夹AV文件的名称。它打开此文件并对其执行一些操作(并非所有必需的操作都在代码中)。

    public async static Task<Book> ParseFile(string bookN)
    {
        string bookName = bookN.Replace(" ", "");

        StorageFile bookFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Assets/AV/" + bookName + ".txt"));
        string content = await FileIO.ReadTextAsync(bookFile);

        string chapterStr = "CHAPTER";

        int numOfChapters = Utilities.NumOfTimesStringOccurs(content, chapterStr);

        Book book = new Book(bookName, numOfChapters);
        //book.Chapters = new List<Chapter>(numOfChapters);

        return book;
    }

问题在于这一行:

    string content = await FileIO.ReadTextAsync(bookFile);

我知道这是因为我在方法的第一行设置了一个断点。进入代码后,该特定行打破并打开.g.cs文件,并突出显示一条显然暗示编译器无法跟踪它的行。这条线与diagnostics.debugger或类似的东西有关。

我尝试的下一步是放入try并在MessageDialog中显示错误。这个错误是:

    Object reference was not found

或类似的东西。

我在想这可能就是

    StorageFile bookFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Assets/AV/" + bookName + ".txt"));

导致了这个问题,因为它有await因此可能在下一行执行之前操作未完成。但我不希望它变慢,因为文件夹中的文件平均只有5到6 kB。

我不知道这是什么错,因为这是我第一次使用Storage命名空间类,因为我是Windows Store编程的新手。

修改

完成此MSDN Forum后,我将代码更改为:

    StorageFile bookFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Assets/AV/" + bookName + ".txt"));
    Windows.Storage.Streams.IRandomAccessStream ras = await bookFile.OpenReadAsync();
    Windows.Storage.Streams.DataReader reader = new Windows.Storage.Streams.DataReader(ras.GetInputStreamAt(0));
    int numOfBytes = (int)ras.Size;
    Byte[] bytes = new Byte[numOfBytes - 1];
    await reader.LoadAsync((uint)numOfBytes);
    reader.ReadBytes(bytes);
    string content = Convert.ToBase64String(bytes);

此代码实际上应该有效,因为当我在断点期间逐步执行它时,没有错误。但由于某种原因,我无法理解,该应用程序无法做出反应。当我设置一个断点并且我进入代码时,它可以工作(我的意思是它不会中断;它不会给我预期的输出)但是当没有时,它就会冻结&#34;。

我最初认为文件的大小(201 kB)花了太长时间,所以我把它改成了另一个尺寸小得多(~3 kb),但它是一样的。现在我认为它与asyncawait有关。我希望有一种方法可以不使用它们。

编辑:
我没有发布这个答案,因为我意识到它解决了问题,但问题并没有包含足够的信息来得到答案。

解决方案是我没有在调用此方法的方法上使用await。我会删除它但我想也许它可以帮助某人。感谢所有试图解决它的人。

1 个答案:

答案 0 :(得分:0)

首先,您可以检查文件(Assets/AV/someone.txt)的属性。

构建操作 应为 内容 。但不是嵌入式资源或其他。

如果还是错误的话。然后检查 文件是否存在