我目前正在尝试将大量现有同步代码移植到 WinRT。
作为其中的一部分,我遇到了期望某些操作是同步的现有代码的问题 - 例如对于文件 I/O
为了使现有代码适应 WinRT 中的 IAsyncOperation 样式 API,我使用了一种将 IAsyncOperation 包装为扩展方法的技术,例如:
namespace Cirrious.MvvmCross.Plugins.File.WinRT
{
public static class WinRTExtensionMethods
{
public static TResult Await<TResult>(this IAsyncOperation<TResult> operation)
{
var task = operation.AsTask();
task.Wait();
if (task.Exception != null)
{
// TODO - is this correct?
throw task.Exception.InnerException;
}
return task.Result;
}
}
}
来自MvvmCross WinRT ExtensionMethods - 使用类似的方法IAsyncAction
这些包装器似乎工作 - 它们允许我Async
在同步代码中使用这些方法,例如:
public IEnumerable<string> GetFilesIn(string folderPath)
{
var folder = StorageFolder.GetFolderFromPathAsync(ToFullPath(folderPath)).Await();
var files = folder.GetFilesAsync().Await();
return files.Select(x => x.Name);
}
我知道这并不真正符合 WinRT 的精神。但我希望这些方法通常只会首先在后台线程上调用;我写这篇文章的目的是让我的代码跨平台兼容 - 包括尚未支持 await-async 的平台和/或尚未准备好进行跳跃的开发人员。
所以......问题是:使用这种类型的代码有什么风险?
作为第二个问题,有没有更好的方法可以实现文件 I/O 等领域的代码重用?