Ich versuche derzeit, eine Menge existierender synchroner Codes nach WinRT zu portieren.Welche Risiken bestehen beim Umbruch von Async/IAsyncOperationen mit Task.Wait() - Code?
Als Teil davon habe ich Probleme mit dem vorhandenen Code, der erwartet, dass einige Operationen synchron sind - z. für Datei-I/O
diesen bestehenden Code anzupassen mit dem IAsyncOperation Stil API innerhalb WinRT zu arbeiten, habe ich eine Technik zum Einwickeln des IAsyncOperation mit einem Verlängerungsverfahren wie verwendet:
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;
}
}
}
von MvvmCross WinRT ExtensionMethods - mit einem ähnlichen Verfahren für IAsyncAction
diese Wrapper scheint zu funktionieren - und sie erlauben mir die Async
Methoden in synchronem Code zu verwenden, wie:
public IEnumerable<string> GetFilesIn(string folderPath)
{
var folder = StorageFolder.GetFolderFromPathAsync(ToFullPath(folderPath)).Await();
var files = folder.GetFilesAsync().Await();
return files.Select(x => x.Name);
}
Ich verstehe, dass dies nicht wirklich im Sinne von WinRT ist; aber ich erwarte, dass diese Methoden normalerweise nur auf Hintergrund-Threads aufgerufen werden; und ich schreibe dies mit dem Ziel, meinen Code plattformübergreifend kompatibel zu machen - auch auf Plattformen, die noch nicht auf async warten und/oder auf Entwickler, die noch nicht bereit sind, den Sprung zu machen.
Also ... die Frage ist: Mit welchen Risiken gehe ich mit dieser Art von Code?
Und als eine zweite Frage, gibt es eine bessere Möglichkeit, Code Wiederverwendung für Bereiche wie File I/O zu erreichen?
http://feedproxy.google.com/~r/AyendeRahien/~3/71OP6uo3bTQ/when-using-the-task-parallel-library-wait-is-a-bad-warning-sign –