/ / Ejecutar código asíncrono como síncrono - c #, .net, multithreading, task-parallel-library

Ejecute código asíncrono como síncrono - c #, .net, multithreading, task-parallel-library

Tengo el siguiente código asíncrono:

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
}

Y el código de uso asíncrono.

var preprocessingTaskResults = await Preprocess(someAction);

Para algunos casos necesito llamarlo de forma síncrona. Para casos más simples (cuando el método asíncrono solo devuelve una tarea) solía hacer lo siguiente:

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

Pero estoy confundido de cómo debería implementarlo aquí.

Respuestas

3 para la respuesta № 1

Una tarea Result la propiedad se bloqueará hasta que la tarea se complete y luego devolverá su resultado:

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

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


1 para la respuesta № 2

No hay una manera fácil de llamar al código asíncrono de forma síncrona. Stephen Toub cubre algunos enfoques diferentes aquí Pero no hay un enfoque que funcione en todas las situaciones.

La mejor solución es cambiar el código de llamada síncrono para que sea asíncrono. Con el advenimiento de Microsoft.Bcl.Async y lanzamientos recientes de Xamarin, código asíncrono.ahora es compatible con .NET 4.0 (y superior), Windows Phone 7.1 (y superior), Windows Store, Silverlight 4 (y superior), iOS / MonoTouch, Android / MonoDroid y bibliotecas de clases portátiles para cualquier combinación de esas plataformas.

Así que hay muy poca razón en estos días. no usar async.

Pero si tu absolutamente necesario una API síncrona, entonces la mejor solución eshazlo sincrónico todo el camino. Si necesita APIs asíncronas y sincrónicas, esto causará una duplicación de código que es desafortunada pero es la mejor solución en este momento.