Mam następujący kod asynchroniczny:
public async Task<List<PreprocessingTaskResult>> Preprocess(Action onPreprocessingTaskFinished)
{
var preprocessingTasks = BuildPreprocessingTasks();
var preprocessingTaskResults = new List<PreprocessingTaskResult>();
while (preprocessingTasks.Count > 0)
{
//Wait till at least one task is completed
await TaskEx.WhenAny(preprocessingTasks.ToArray());
onPreprocessingTaskFinished();
}
return
}
I asynchroniczny kod użytkowania
var preprocessingTaskResults = await Preprocess(someAction);
W niektórych przypadkach muszę to nazwać synchronicznie. W prostszych przypadkach (gdy metoda asynchroniczna zwraca tylko zadanie) wykonałem następujące czynności:
var someTask = AsyncMethod();
Task.Wait(someTask);
Ale jestem zdezorientowany, jak powinienem to tutaj wdrożyć.
Odpowiedzi:
3 dla odpowiedzi № 1Zadanie Result
właściwość będzie blokować do czasu zakończenia zadania, a następnie zwróci wynik:
List<PreprocessingTaskResult> result = Preprocess(someAction).Result;
http://msdn.microsoft.com/en-us/library/dd321468(v=vs.110).aspx
1 dla odpowiedzi nr 2
Nie ma łatwego sposobu na synchroniczne wywoływanie kodu asynchronicznego. Stephen Toub omawia różne podejścia tutaj ale nie ma podejścia, które działałoby we wszystkich sytuacjach.
Najlepszym rozwiązaniem jest zmiana kodu wywoływania synchronicznego na asynchroniczny. Z nadejściem Microsoft.Bcl.Async
oraz ostatnie wydania Xamarin, kodu asynchronicznegojest teraz obsługiwany w .NET 4.0 (i wyższych), Windows Phone 7.1 (i wyższych), Windows Store, Silverlight 4 (i wyższych), iOS / MonoTouch, Android / MonoDroid oraz bibliotekach klas przenośnych dla dowolnej kombinacji tych platform.
Więc obecnie jest bardzo mało powodów nie używać async
.
Ale jeśli ty absolutnie potrzebujesz synchroniczny interfejs API, więc najlepszym rozwiązaniem jestspraw, by był zsynchronizowany przez całą drogę. Jeśli potrzebujesz zarówno asynchronicznego, jak i synchronicznego interfejsu API, spowoduje to duplikację kodu, co jest niefortunne, ale jest to obecnie najlepsze rozwiązanie.