2013-01-13 5 views
5

Se ho un corpo del metodo asincrono in questo modo -Prendi l'istanza di attività corrente in un corpo di un metodo asincrono

public async Task GetSomething() { 

    await SendText("hi"); 
    await SendImage("bla.bmp"); 

} 

Come posso ottenere l'oggetto Task prima di essere restituito all'utente quando i calci attendono in

cioè ..

public async Task GetSomething() { 

    myTasks.Add(Task.Current); 
    await SendText("hi"); 
    await SendImage("bla.bmp"); 

    //some processing 

} 

in modo che da qualche altra parte posso fare

await Task.WhenAll(myTasks); 
Console.WriteLine("All tasks complete"); 

Questo è così che posso aspettare per tutte le attività da completare prima di spegnere

+0

Quali sono le firme per 'SendText' e' SendImage'? – oleksii

+0

Non fa differenza. Questo è solo un codice fittizio per mostrare che GetSomething esegue più operazioni secondarie. Sostituisci quelli con Thread.Sleep (50000) se lo rende più chiaro. – NoPyGod

+0

Sì, sì. I metodi possono restituire 'void',' Task' e 'Task ', se è 'Task' o' Task 'è possibile rifattorizzare il codice. È possibile ottenere oggetti compito e aggiungerli a un singolo array. – oleksii

risposta

4

Questo non è direttamente possibile in quanto la lingua non ha un impianto per accedere al compito "corrente".

C'è una soluzione alternativa: avvolgi il tuo metodo asincrono in un altro metodo. Questo altro metodo può acquisire l'attività una volta restituito il metodo asincrono (che si verifica approssimativamente al primo punto di attesa).

In tutti i casi, si consiglia di consentire al chiamante di aggiungere l'attività asincrona al proprio elenco, non il metodo asincrono stesso. Questo è utile anche dal punto di vista dell'incapsulamento.

+0

Sembra che tu abbia ragione. Non so se questo significa che sto facendo qualcosa di sbagliato o se un caso d'uso simile non è stato pensato prima. Avrei pensato che tenere traccia di tutti i metodi asincroni sarebbe abbastanza comune. Credo che dovrò distruggere il mio codice avvolgendolo in una funzione interiore. – NoPyGod

Problemi correlati