2012-06-27 15 views
15

Tengo problemas para usar las nuevas herramientas async/await en C#. Aquí está mi escenario:Sintaxis para iniciar muchas tareas asíncronas en C#

static async Task<bool> ManageSomeRemoteTask(int Id, bool flag) 
{ 
    var result = await serviceClient.AuthenticateIdAsync(Id); 
    [... Setup Some Data ...] 
    await serviceClient.LongAndSlowRemoteCallAsync(Data); 
} 

static void SendATonOfJunkToSomeWebServiceThatDoesntSupportBatches 
{ 
    var myTasks = Dictionary<int, Task<bool>>(); 
    while(IdsLeftToProcess > 0) 
    { 
     Task<bool> t = ManageSomeRemoteTask(Id, true); 
     myTasks.Add(IdsLeftToProcess ,t); 
     myTasks[IdsLeftToProcess].Start(); 
     IdsLeftToProcess --; 
    } 

    Task.WaitAll(myTasks.Values.ToArray()); //Wait until they are all done 
    [... Report statistics ...] 
} 

tengo 1 problema de que cuando trato de ejecutar esto, me sale un InvalidOperationException en el inicio() con el mensaje de error " de inicio no puede ser llamado en una tarea de estilo promesa . "Este mensaje de error no aparece en Google o Bing, así que no estoy seguro de lo que significa. Esta es mi preocupación número uno, cómo hacer que esto funcione. También probé TaskFactory.StartNew() pero no entendí cómo pasar parámetros a mi método de esa manera.

+1

A pesar de mi opinión de que la línea no debería estar allí en absoluto, se ahorraría un poco de tiempo al no tirar de algo que ya tiene una referencia al rendimiento del diccionario como tal ... 'myTasks [IdsLeftToProcess] .Start();' se habría representado mejor por 't.Start()' (si fuera necesario en primer lugar) – spender

Respuesta

26

Las tareas devueltas por métodos async son siempre caliente es decir, se crean en estado En ejecución. Intenta eliminar task.Start() de tu código, debería arreglarlo.

Una cita de Stephen Toub's Async/Await FAQ:

¿Es necesario “Inicio” Las tareas creadas por métodos marcados como “asíncrono”?

No. Tareas devueltos de métodos de toma están “calientes”, es decir, las tareas representan operaciones que ya están en curso. No solo no necesita llamar a ".Start()" en dichas tareas, sino que al hacerlo fallará si lo intenta. Para obtener más detalles, consulte las preguntas frecuentes en Task.Start.

+0

¿Referencia de la documentación? –

+1

@Jonathon Reinhart: agregó una referencia, gracias por señalar – alexm

+0

Es fácil pasar por alto pequeños tid-bits como esa información. Gracias por la ayuda. – Jason

9

No necesita iniciar las tareas devueltas por llamadas al método async. Se inician por defecto.

+3

En realidad, * no * puede iniciarlos. – svick

+1

¿No es de eso de lo que se trata la pregunta? – spender

+3

Dijiste que no necesitas iniciarlos, eso implica que puedes hacerlo si quieres. Pero eso no es verdad – svick

Cuestiones relacionadas