Attualmente sto provando a portare una buona quantità di codice sincrono esistente a WinRT.Quali sono i rischi del wrapping Async/Await IAsyncOperations con il codice Task.Wait()?
Come parte di questo, sto riscontrando problemi con il codice esistente che prevede che alcune operazioni siano sincrone - ad es. per il file I/O
di adattare questo codice esistente per lavorare con l'API stile IAsyncOperation all'interno WinRT, ho usato una tecnica di avvolgere l'IAsyncOperation con un metodo di estensione del tipo:
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;
}
}
}
da MvvmCross WinRT ExtensionMethods - con un metodo simile per IAsyncAction
Questi involucri sembra funzionare - e mi permettono di usare i metodi Async
nel codice sincrono come:
public IEnumerable<string> GetFilesIn(string folderPath)
{
var folder = StorageFolder.GetFolderFromPathAsync(ToFullPath(folderPath)).Await();
var files = folder.GetFilesAsync().Await();
return files.Select(x => x.Name);
}
Capisco che questo non è proprio nello spirito di WinRT; ma mi aspetto che questi metodi vengano normalmente richiamati solo sui thread in background; e sto scrivendo questo con l'obiettivo di rendere il mio codice compatibile multipiattaforma - anche con piattaforme che non supportano ancora attend-async e/o sviluppatori che non sono ancora pronti a fare il salto.
Quindi ... la domanda è: quali rischi sono in esecuzione utilizzando questo tipo di codice?
E come seconda domanda, c'è un modo migliore per ottenere il riutilizzo del codice per aree come I/O file?
http://feedproxy.google.com/~r/AyendeRahien/~3/71OP6uo3bTQ/when-using-the-task-parallel-library-wait-is-a-badwaring-sign –