Domanda

Per quanto ne so, quando il runtime arriva attraverso la dichiarazione di seguito, avvolge il resto della funzione come callback sul metodo che viene invocato asincrono (someCall() in questo esempio).In questo caso anotherCall() verrà eseguito come callback a someCall():

    await someCall();
    await anotherCall();
.

Mi chiedo se è possibile effettuare il runtime esegui come questo: chiama someCall() in Async Fashion e restituisci immediatamente al thread di chiamata, quindi richiamare anotherCall() in modo simile (senza attesa someCall per completare).Perché ho bisogno di questi due metodi per eseguire asincrono e supporre che queste chiamate siano solo fuoco e dimentica le chiamate.

È possibile implementare questo scenario utilizzando solo async e await (non utilizzando il vecchio meccanismo begin / end)?

È stato utile?

Soluzione

L'ASYNC / AWAITARE include alcuni operatori per aiutare con la composizione parallela, ad esempio WhenAll e WhenAny.

var taskA = someCall(); // Note: no await
var taskB = anotherCall(); // Note: no await

// Wait for both tasks to complete.
await Task.WhenAll(taskA, taskB);

// Retrieve the results.
var resultA = taskA.Result;
var resultB = taskB.Result;
.

Altri suggerimenti

Il modo più semplice è probabilmente quello di fare questo:

var taskA = someCall();
var taskB = someOtherCall();
await taskA;
await taskB;
.

Questo è particolarmente bello se vuoi i valori dei risultati:

var result = await taskA + await taskB;
.

Quindi non è necessario fare taskA.Result.

TaskEx.WhenAll potrebbe essere più veloce di due aspetti l'uno dopo l'altra.Non so da quando non ho fatto indagini sulle prestazioni su questo, ma a meno che non vedi un problema, penso che i due aspetti consecutivi siano migliori, specialmente se hai ewant i valori dei risultati.

L'ASYNC CTP non è più necessario a condizione che tu stia utilizzando .NET 4.5.Si noti che la funzionalità ASYNC è implementata dal compilatore, quindi le app .NET 4 possono usarlo ma VS2012 è necessario compilare.

Taskex non è più necessario.Il CTP non può modificare il framework esistente in modo da utilizzare le estensioni per realizzare le cose che la lingua gestirebbe in 5.0.Basta usare il compito direttamente.

Così qui, ho riscritto il codice (risposto da Stephen Cleary) sostituendo Taskex con compito.

var taskA = someCall(); // Note: no await
var taskB = anotherCall(); // Note: no await

// Wait for both tasks to complete.
await Task.WhenAll(taskA, taskB);

// Retrieve the results.
var resultA = taskA.Result;
var resultB = taskB.Result;
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top