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);