Nel contesto di un console applicazione utilizzando asincrona/attendono costrutti, vorrei sapere se è possibile per "continuazioni" per eseguire in parallelo su più thread su diverse CPU.Task continuazione esecuzione parallelo asincrono/attendono
Penso che questo sia il caso, poiché le continuazioni sono pubblicate sul programmatore di attività predefinito (nessun SynchronizationContext nell'app console), che è il pool di thread.
So che il costrutto asincrono/attendi non costruisce nessun thread aggiuntivo. Ancora ci dovrebbe essere almeno un thread costruito per CPU dal pool di thread, e quindi se le continuazioni sono pubblicate nel pool di thread, potrebbe pianificare le continuazioni delle attività in parallelo su diverse CPU ... è quello che ho pensato, ma per qualche ragione sono molto confuso ieri riguardo a questo e non ne sono più così sicuro.
Ecco alcune semplici righe di codice:
public class AsyncTest
{
int i;
public async Task DoOpAsync()
{
await SomeOperationAsync();
// Does the following code continuation can run
// in parrallel ?
i++;
// some other continuation code ....
}
public void Start()
{
for (int i=0; i<1000; i++)
{ var _ = DoOpAsync(); } // dummy variable to bypass warning
}
}
SomeOperationAsync non crea alcun filo in se stessa, e diciamo che per il bene della esempio, che li invia alcune richieste in modo asincrono basandosi su completamento di I/O porta in modo da non bloccare alcun thread.
Ora, se chiamo il metodo Start che emetterà 1000 operazioni asincrone, è possibile che il codice di continuazione del metodo asincrono (dopo l'attesa) venga eseguito in parallelo su diversi thread della CPU? Devo occuparmi della sincronizzazione dei thread in questo caso e sincronizzare l'accesso al campo "i"?
Vuoi che vengano eseguiti in parallelo o no? Se lo fai, è abbastanza facile sincronizzare tutte le chiamate, semplicemente 'attendi DoOpAsync' in' Start'. – Servy