5

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"?

+0

Vuoi che vengano eseguiti in parallelo o no? Se lo fai, è abbastanza facile sincronizzare tutte le chiamate, semplicemente 'attendi DoOpAsync' in' Start'. – Servy

risposta

4

Sì, è necessario inserire la logica di sincronizzazione thread attorno a i++ perché è possibile che più thread eseguano il codice dopo await allo stesso tempo.

Come risultato del ciclo for, verrà creato il numero di attività. Queste attività verranno eseguite su thread di pool di thread diversi. Una volta che queste attività sono state completate, la continuazione, ovvero il codice dopo l'attesa, verrà eseguito nuovamente su thread di Thread Pool diversi. Ciò rende possibile che più thread eseguano contemporaneamente i ++ nello

+0

Grazie per la tua risposta Haris! – darkey

2

La tua comprensione è corretta: nelle applicazioni Console, per impostazione predefinita le continuazioni verranno programmate nel pool di thread a causa dell'impostazione predefinita SynchronizationContext.

Ogni metodo async si avvia in modo sincrono, pertanto il ciclo for eseguirà l'inizio di DoOpAsync sullo stesso thread. Supponendo che SomeOperationAsync restituisca un valore incompleto Task, le continuazioni verranno pianificate nel pool di thread.

Quindi ciascuna delle invocazioni di DoOpAsync può continuare in parallelo.

+0

Grazie Stefano per aver chiarito :) – darkey

Problemi correlati