Actualmente estoy tratando de portar una gran cantidad de código síncrono existente a WinRT.¿Cuáles son los riesgos de ajustar Async/Await IAsyncOperations con el código Task.Wait()?
Como parte de esto, estoy teniendo problemas con el código existente esperando que algunas operaciones sean sincrónicas, p. Ej. para el archivo de E/S
Para adaptar el código existente para trabajar con la API de estilo IAsyncOperation dentro WinRT, he utilizado una técnica de envolver la IAsyncOperation con un método de extensión como:
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;
}
}
}
de MvvmCross WinRT ExtensionMethods - con un método similar para IAsyncAction
Estas envolturas parece funcionar - y que me permite utilizar los métodos Async
en código sincrónica como:
public IEnumerable<string> GetFilesIn(string folderPath)
{
var folder = StorageFolder.GetFolderFromPathAsync(ToFullPath(folderPath)).Await();
var files = folder.GetFilesAsync().Await();
return files.Select(x => x.Name);
}
Entiendo que esto no está realmente en el espíritu de WinRT; pero, en primer lugar, espero que, en primer lugar, se invoque a estos métodos en los hilos de fondo; y estoy escribiendo esto con el objetivo de hacer que mi código sea compatible con plataformas cruzadas, incluso para plataformas que todavía no admiten la espera asincrónica y/o para desarrolladores que todavía no están listos para dar el salto.
Entonces ... la pregunta es: ¿qué riesgos corro al usar este tipo de código?
Y como segunda pregunta, ¿hay alguna forma mejor de lograr la reutilización de código para áreas como File I/O?
http://feedproxy.google.com/~r/AyendeRahien/~3/71OP6uo3bTQ/when-using-the-task-parallel-library-wait-is-a-bad- warning-sign –