/ / Изпълнение на асинхронен код като синхронен - ​​c #, .net, multithreading, задача-паралелна библиотека

Изпълнява асинхронен код като синхронно - c #, .net, multithreading, задача-паралелна библиотека

Имам следния асинхронен код:

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
}

Асинхронният код за ползване

var preprocessingTaskResults = await Preprocess(someAction);

В някои случаи трябва да го наричат ​​синхронизирано. За по-опростени случаи (когато методът за синхронизация връща само задача) използвах следното:

var someTask = AsyncMethod();
Task.Wait(someTask);

Но аз съм объркан как трябва да го изпълнявам тук.

Отговори:

3 за отговор № 1

Задачата е Result собствеността ще блокира до приключване на задачата и връщането на резултата:

List<PreprocessingTaskResult> result = Preprocess(someAction).Result;

http://msdn.microsoft.com/en-us/library/dd321468(v=vs.110).aspx


1 за отговор № 2

Няма синхронизиран начин да се обажда асинхронен код. Стивън Туб обхваща различни подходи тук но няма подход, който да работи във всички ситуации.

Най-доброто решение е да промените синхронния код за повикване да бъде асинхронен. С появата на Microsoft.Bcl.Async и последните издания на Xamarin, асинхронен кодсега е поддържана на .NET 4.0 (и по-висока), Windows Phone 7.1 (и по-висока), Windows Store, Silverlight 4 (и по-нова версия), iOS / MonoTouch, Android / MonoDroid и портативни класни библиотеки за всяка комбинация от тези платформи.

Така че има много малко причина тези дни не да използвам async.

Но ако вие абсолютно необходима синхронен API, тогава най-доброто решение е данаправи го синхронни по целия път. Ако имате нужда от асинхронни и синхронни приложни програмни интерфейси (API), това ще доведе до дублиране на кода, което е неприятно, но това е най-доброто решение в този момент.