【问题标题】:How to read a file in UWP with Windows.Storage [duplicate]如何使用 Windows.Storage 在 UWP 中读取文件 [重复]
【发布时间】:2020-01-08 20:25:58
【问题描述】:

我目前使用这个函数写入文件:

StorageFolder storageFolder = ApplicationData.Current.LocalFolder;
StorageFile sampleFile = await storageFolder.GetFileAsync("test.txt");
WriteToFile<List<Class>>(classesArray, sampleFile);

public static async void WriteToFile<T>(T objectToWrite, StorageFile file) where T : new()
{
    TextWriter writer = null;
    try
    {
        var serializer = new XmlSerializer(typeof(T));
        var stream = await file.OpenStreamForWriteAsync();
        writer = new StreamWriter(stream);
        serializer.Serialize(writer, objectToWrite);
    }
    finally
    {
        if (writer != null)
            writer.Close();
    }
}

所以我认为我可以这样做来读取同一个文件:

StorageFolder storageFolder = ApplicationData.Current.LocalFolder;
StorageFile sampleFile = await storageFolder.GetFileAsync("test.txt");
classesArray = ReadFromFile(sampleFile);

public static async T ReadFromFile<T>(StorageFile file) where T : new()
{
    TextReader reader = null;
    try
    {
        var serializer = new XmlSerializer(typeof(T));
        var stream = await file.OpenStreamForReadAsync();
        reader = new StreamReader(stream);
        return (T)serializer.Deserialize(reader);
    }
    finally
    {
        if (reader != null)
            reader.Close();
    }
}

但它说“异步方法的返回类型必须是 void、Task、Task、类似任务的类型、IAsyncEnumerable 或 IAsyncEnumerator”

我认为有一个简单的解决方案,但我对 c# 和 UWP 比较陌生,所以没有任何线索。

【问题讨论】:

标签: c# asynchronous uwp


【解决方案1】:

其实你应该把这两个方法都修改为正确的async。目前第一种方法是async void,它是一种反模式——所有异步方法都应该返回类似Task 的类型,除非它们是事件处理程序(在这种情况下,除了async void,你别无选择)。

使用Task 作为返回类型很重要,因为在async void 的情况下,您正在执行一种称为“即发即弃”的操作,这意味着如果在方法执行过程中发生故障并抛出异常,它将丢失而且您永远不会知道该方法实际上失败了。相反,如果一个方法返回一个Task,异常将被包装在这个任务中。之后,当您await 方法时,它将自动重新抛出。此外,当“即发即弃”方法执行到达第一个“真实”await 时,调用线程将看到这一点,就好像该方法已经完成,并将继续执行下一条语句。这通常不是您想要的。

所以你应该编辑第一个方法的标题如下:

public static async Task WriteToFileAsync<T>(T objectToWrite, StorageFile file) 
      where T : new()
{
   ...
}

第二个方法的头如下:

public static async Task<T> ReadFromFileAsync<T>(StorageFile file) 
     where T : new()
{
   ...
}

请注意,我在方法名称中添加了 Async 后缀,以明确它们是异步的并且应该等待(这是 C# 约定)。

最后,当你现在调用方法时,你应该await他们:

StorageFolder storageFolder = ApplicationData.Current.LocalFolder;
StorageFile sampleFile = await storageFolder.GetFileAsync("test.txt");
await WriteToFileAsync<List<Class>>(classesArray, sampleFile);

StorageFolder storageFolder = ApplicationData.Current.LocalFolder;
StorageFile sampleFile = await storageFolder.GetFileAsync("test.txt");
classesArray = await ReadFromFileAsync(sampleFile);

【讨论】:

    猜你喜欢
    • 2013-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-23
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多