/ / Wykonaj kod asynchroniczny jako synchroniczny - c #, .net, wielowątkowość, biblioteka zadań równolegle

Wykonywanie kodu asynchronicznego jako synchronicznego - c #, .net, wielowątkowość, biblioteka równoległych zadań

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 № 1

Zadanie 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.