我遵循官方Xamarin指南的跨平台文件处理使用.net-standard-2.0项目。该应用程序旨在为Android和Windows构建。
这给我提了个问题。接口代码如下所示。
public interface ISaveAndLoad {
void SaveText (string filename, string text);
string LoadText (string filename);
}然而,给出的UWP代码被写成
[assembly: Dependency(typeof(SaveAndLoad_WinApp))]
namespace WindowsApp
{
// https://msdn.microsoft.com/en-us/library/windows/apps/xaml/hh758325.aspx
public class SaveAndLoad_WinApp : ISaveAndLoad
{
public async Task SaveTextAsync(string filename, string text)
{
StorageFolder localFolder = ApplicationData.Current.LocalFolder;
StorageFile sampleFile = await localFolder.CreateFileAsync(filename, CreationCollisionOption.ReplaceExisting);
await FileIO.WriteTextAsync(sampleFile, text);
}
public async Task<string> LoadTextAsync(string filename)
{
StorageFolder storageFolder = ApplicationData.Current.LocalFolder;
StorageFile sampleFile = await storageFolder.GetFileAsync(filename);
string text = await Windows.Storage.FileIO.ReadTextAsync(sampleFile);
return text;
}
}
}代码不会编译,因为SaveAndLoad_WinApp没有实现接口ISaveAndLoad。
我知道我可以将接口更改为Task和Task<string>,所以它将编译。
然而,问题可以追溯到Android。UWP使用的是安卓系统上不存在的Windows.Storage.FileIO。虽然安卓正在使用System.IO,但它没有一个可以等待的异步方法。这意味着我不能共享这个界面,因为UWP需要async Task<string>,但是Android只返回一个string而不是一个Task。
如果我没有在UWP方法中使用async,那么FileIO将不会反过来工作。async void for SaveText运行良好,因为接口状态为void。但是,它不允许我为async string设置LoadText,因为异步方法必须返回Task<T>、Task或void。
看起来,在允许代码同步运行的同时,在Android上实现异步也是可行的。但是,我觉得我做错了什么,因为Xamarin示例显示它应该工作。
我在这里是误解了什么还是错过了一个实现?或者,在Xamarin文档中它实际上是错误的?
更新#1我为SaveText设置了一个async void,并意识到存在一个线程不需要等待的问题。它会快速转发到下一个函数。因此,我实际上必须等待功能在PCL的UWP。然而,安卓系统的实现是一个不容期待的void。所以它实际上导致了一个错误..。对于如何实现这个场景,有什么建议吗?
这是我在PCL中输入的代码
public static void Save(){
DependencyService.Get<ISaveAndLoad>().SaveText("temp.txt", input.Text);
}发布于 2017-12-10 06:20:38
代码不会编译,因为SaveAndLoad_WinApp没有实现接口ISaveAndLoad。
您可以下载文档示例WorkingWithFiles,可以找到它这里。在这个示例中,ISaveAndLoad接口有一点不同:
public interface ISaveAndLoad
{
Task SaveTextAsync (string filename, string text);
Task<string> LoadTextAsync (string filename);
bool FileExists (string filename);
}UWP使用的是安卓系统上不存在的Windows.Storage.FileIO。虽然安卓正在使用System.IO,但它没有一个可以等待的异步方法。
您可以在示例项目中引用Android.cs类,使用StreamWriter.WriteAsync()方法:
public class SaveAndLoad_Android : ISaveAndLoad
{
#region ISaveAndLoad implementation
public async Task SaveTextAsync (string filename, string text)
{
var path = CreatePathToFile (filename);
using (StreamWriter sw = File.CreateText (path))
await sw.WriteAsync(text);
}
public async Task<string> LoadTextAsync (string filename)
{
var path = CreatePathToFile (filename);
using (StreamReader sr = File.OpenText(path))
return await sr.ReadToEndAsync();
}
public bool FileExists(string filename)
{
return File.Exists(CreatePathToFile(filename));
}
#endregion
string CreatePathToFile(string filename)
{
var docsPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
return Path.Combine(docsPath, filename);
}
}然后在您的PCL中,使用如下的SaveTextAsync方法:
var fileService = DependencyService.Get<ISaveAndLoad> ();
...
saveButton.Clicked += async (sender, e) =>
{
loadButton.IsEnabled = saveButton.IsEnabled = false;
// uses the Interface defined in this project, and the implementations that must
// be written in the iOS, Android and WinPhone app projects to do the actual file manipulation
await fileService.SaveTextAsync (fileName, input.Text);
loadButton.IsEnabled = saveButton.IsEnabled = true;
};https://stackoverflow.com/questions/47728317
复制相似问题