Ho il seguente codice (semplificato):nidificati Async/attendono Non sembra essere Scaling
public async Task GetData(DomainObject domainObject, int depth)
{
// This async operation is really quick, and there's usually like five.
IEnumerable<TierOne> tierOnes = await domainObject.GetTierOnesAsync();
var tierOneTasks = tierOnes.Select(async tierOne =>
{
// This async operation is really quick and there's usually like three.
IEnumerable<TierTwo> tierTwos = await tierOne.GetTierTwosAsync();
if (depth <= TierTwoDepth)
return;
var tierTwoTasks = tierTwos.Select(async tierTwo =>
{
// This async operation is usually fast, and there's usually >= 100.
IEnumerable<TierThree> tierThrees = await tierTwo.GetTierThreesAsync();
if (depth <= TierThreeDepth)
return;
var tierThreeTasks = tierThrees.Select(async tierThree =>
{
// This async operation is SLOW, and there's usually.. 50?
await tierThree.GetTierFoursAsync();
});
await Task.WhenAll(tierThreeTasks.ToArray());
});
await Task.WhenAll(tierTwoTasks.ToArray());
});
await Task.WhenAll(tierOneTasks.ToArray());
}
base al largo di quello che ho visto, non sembra essere scalare molto bene. Tutte le operazioni di Async
sono operazioni "true async", il che significa che sono tutti I/O.
Sto usando Async/Attendere in modo errato per questo scenario? Basandomi sulle mie attuali osservazioni, non è il ridimensionamento a ciò che mi aspetterei. TPL DataFlow sarebbe la mia soluzione?
"sembra che si stia adattando molto bene" è un errore di battitura e si mette un "not" in là? E se sì, scalando in che modo, ti aspetti che finisca più velocemente o semplicemente non carichi tanto sul sistema? Come stai testando il ridimensionamento? –
Si stanno utilizzando molti 'IEnumerables' come valori di ritorno asincrono. Sei sicuro che l'esecuzione differita non interferisca con la tua presunta parallelizzazione? – nvoigt
@ScottChamberlain Sì, quello era un errore di battitura. Mi aspetto che finisca più velocemente. Capisco che arriverà alla stessa velocità con cui verrà elaborata la parte ricevente delle mie operazioni asincrone. Sembra che se spoolare 1500 attività, mi aspetterei che solo 3 o 4 siano bloccati nella parte 'Await' della macchina a stati. (Scusa se questo non ha senso. È tardi e sono molto assonnato.) – Cameron