C# 如何使用Windows.Storage在UWP中读取文件

C# 如何使用Windows.Storage在UWP中读取文件,c#,asynchronous,uwp,C#,Asynchronous,Uwp,我当前使用此函数写入文件: StorageFolder storageFolder = ApplicationData.Current.LocalFolder; StorageFile sampleFile = await storageFolder.GetFileAsync("test.txt"); WriteToFile<List<Class>>(classesArray, sampleFile); public static async void WriteToF

我当前使用此函数写入文件:

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=wait-storageFolder.GetFileAsync(“test.txt”);
WriteToFile(classesArray,sampleFile);
公共静态异步void WriteToFile(T objectToWrite,StorageFile file),其中T:new()
{
TextWriter=null;
尝试
{
var serializer=newxmlserializer(typeof(T));
var stream=await file.OpenStreamForWriteAsync();
writer=新的流writer(流);
serializer.Serialize(writer,objectToWrite);
}
最后
{
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();
    }
}
StorageFolder-StorageFolder=ApplicationData.Current.LocalFolder;
StorageFile sampleFile=wait-storageFolder.GetFileAsync(“test.txt”);
classesArray=ReadFromFile(sampleFile);
公共静态异步T ReadFromFile(StorageFile文件),其中T:new()
{
TextReader=null;
尝试
{
var serializer=newxmlserializer(typeof(T));
var stream=await file.OpenStreamForReadAsync();
读卡器=新的流读卡器(流);
返回(T)序列化程序。反序列化(读取器);
}
最后
{
if(读卡器!=null)
reader.Close();
}
}
但是它说“异步方法的返回类型必须是void、Task、Task、类似任务的类型、iasyncnumerable或iasyncnumerator”


我假设有一个简单的解决方案,但我对c#和UWP相对较新,因此没有任何线索。

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

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

因此,您应该编辑第一个方法的标题,如下所示:

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()
{
   ...
}

几乎与相同。请注意,这并不是真正的Windows存储问题;这是一个C语言问题。
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);