現在、かなりの量の既存の同期コードを 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 をまだサポートしていないプラットフォームや、まだジャンプする準備ができていない開発者も含まれます。
ですから...問題は、このタイプのコードを使用することで、どのようなリスクが発生するのでしょうか?
2 番目の質問として、ファイル I/O などの分野でコードを再利用するためのより良い方法はありますか?