Aktualnie próbuję przenieść do WinRT sporą ilość istniejącego kodu synchronicznego.Jakie są zagrożenia związane z pakowaniem Async/Oczekiwanie na IAsyncOperations za pomocą kodu Task.Wait()?
W związku z tym mam problem z istniejącym kodem, oczekując synchronizacji niektórych operacji - np. dla pliku I/O
Aby przystosować ten istniejący kod do pracy ze stylem API IAsyncOperation w WinRT, Użyłem techniki owijania IAsyncOperation z metodę rozszerzenia jak:
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;
}
}
}
z MvvmCross WinRT ExtensionMethods - o podobnym sposobie IAsyncAction
te opakowania wydaje się działać - i one pozwalają mi korzystać z Async
metody w kodzie synchronicznym jak:
public IEnumerable<string> GetFilesIn(string folderPath)
{
var folder = StorageFolder.GetFolderFromPathAsync(ToFullPath(folderPath)).Await();
var files = folder.GetFilesAsync().Await();
return files.Select(x => x.Name);
}
Rozumiem, że tak naprawdę nie jest to zgodne z duchem WinRT; ale spodziewam się, że te metody będą normalnie wywoływane tylko w wątkach tła; piszę o tym, aby mój kod był kompatybilny z różnymi platformami - w tym na platformach, które jeszcze nie obsługują oczekujących asynchronicznie i/lub programistów, którzy nie są jeszcze gotowi do wykonania skoku.
A więc ... pytanie brzmi: jakie zagrożenia wiążę się z używaniem tego typu kodu?
Co do drugiego pytania, czy istnieje lepszy sposób na ponowne wykorzystanie kodu w obszarach takich jak File I/O?
http://feedproxy.google.com/~r/AyendeRahien/~3/71OP6uo3bTQ/when-using-task-parallel-library-wait-is-a-bad-warning-sign –