我已经在Xamarin中编写了我的应用程序,首先针对Android进行测试,然后针对iOS进行测试。在Android上一切正常,而不是iOS。我的问题与PCLStorage
有关,在阅读文件内容时失败,因为GetFileAsync
结果为null
,而不是CheckExistsAsync
结果。
我的代码是:
public static async Task loadMyFile(Func<bool, Task> result) {
IFolder rootFolder = FileSystem.Current.LocalStorage;
await rootFolder.CheckExistsAsync("myfile.txt").ContinueWith(async (checkExistsTask) => {
if (checkExistsTask.Result == ExistenceCheckResult.FileExists) {
await rootFolder.GetFileAsync("myfile.txt").ContinueWith(async (getFileTask) => {
try
{
await getFileTask.Result.ReadAllTextAsync().ContinueWith(async (readTextTask) => {
try
{
if (!string.IsNullOrEmpty(readTextTask.Result))
{
doWork(readTextTask.Result);
await result(true);
return;
}
else
{
await result(false);
return;
}
}
catch (Exception e)
{
await result(false);
return;
}
});
}
catch (Exception e)
{
await result(false);
return;
}
});
} else {
await result(false);
return;
}
});
}
有什么想法吗? 感谢。
答案 0 :(得分:0)
我还不知道为什么在等待你的任务时你在这里使用ContinueWith
。
我可能会更像这样编写代码:
public static async Task loadMyFile(Func<bool, Task> result)
{
IFolder rootFolder = FileSystem.Current.LocalStorage;
var exists = await rootFolder.CheckExistsAsync("myfile.txt");
if (exists == ExistenceCheckResult.FileExists)
{
var file = await rootFolder.GetFileAsync("myfile.txt");
try
{
var text = await file.ReadAllTextAsync();
if (!string.IsNullOrEmpty(text))
{
doWork(text);
await result(true);
return;
}
else
{
await result(false);
return;
}
}
catch (Exception e)
{
await result(false);
return;
}
} else {
await result(false);
return;
}
}
这更容易阅读,你摆脱了不必要的尝试/捕获。
您可能希望将ConfigureAwait(false)
添加到您的任务中,因此您不需要进行太多的上下文切换。
你可以通过摆脱回调来简化你的方法,并且只是因为你的任务而返回一个bool:
public static async Task<bool> loadMyFile()
{
IFolder rootFolder = FileSystem.Current.LocalStorage;
var exists = await rootFolder.CheckExistsAsync("myfile.txt");
if (exists == ExistenceCheckResult.FileExists)
{
var file = await rootFolder.GetFileAsync("myfile.txt");
try
{
var text = await file.ReadAllTextAsync();
if (!string.IsNullOrEmpty(text))
{
doWork(text);
return true;
}
}
catch (Exception e)
{
}
}
return false;
}