Progettazione di applicazioni multi-thread

5

Attualmente sto pianificando un servizio di Windows. Sarà un'applicazione multi-thread che controllerà continuamente i record del database e li elaborerà. I miei primi pensieri erano di impostare un numero massimo di thread disponibili e creare un nuovo thread per ogni processo. Funziona bene ma, poiché sto creando un nuovo thread per ogni nuovo processo, temo che il suo overhead si moltiplica se ci sono molti record da elaborare. La mia domanda è, è un buon design o consiglieresti qualche altra soluzione?

Ecco cosa farà l'applicazione in pratica:

  1. Verifica il numero di thread disponibili
  2. Se ci sono thread disponibili controlla il database per i record da elaborare.
  3. Se ci sono record da elaborare, seleziona i primi 100 di essi
  4. Crea un nuovo processo
  5. Chiama un servizio web per ogni record e aggiorna il record in base al risultato della chiamata del servizio web (questa chiamata + aggiornamento richiede in genere circa 500ms, quindi il processo sarà attivo per circa 50 secondi)
  6. Continua al passaggio 1

Questo è ciò che sto facendo:

timer1.Tick += Tick();

private void Tick()
{
    //do some text logging
    //do some TextBox updating
}

int MaxThreads = 10

while(true)
{
    if(ThreadCount < MaxThreads)
    {
        new Thread(() => Process()).Start();
        ThreadCount++;
    }
    else
    {
        Thread.Sleep(10000);
    }
}

private void Process()
{
    //call ws
    //update records

    ThreadCount--;
}
    
posta dstr 16.07.2012 - 10:16
fonte

2 risposte

5

Dovresti dare un'occhiata al schema del pool di thread in Wikipedia, penso che questo sia quello che stai cercando. Il trucco è creare n thread una volta all'avvio del servizio, evitando il sovraccarico della creazione del thread (vedi questa domanda su SO ) durante il runtime.

Per quanto riguarda il tuo flusso di lavoro, potresti prendere in considerazione di cambiare i primi due passaggi:
Prima controlla se ci sono record da elaborare, e se ci sono, controlla se il tuo pool di thread ha un thread libero. Questo è un problema di ottimizzazione, si vuole raggiungere la decisione nessuna elaborazione (perché non ci sono dati, o non ci sono risorse per essa) con il minimo sforzo possibile. Se raggiungi questa decisione più spesso perché non ci sono dati da elaborare, controlla prima questo.

Alcuni sostengono che si tratta di un'ottimizzazione prematura, ma personalmente preferisco sbagliare un po 'di più sul lato prematuro.

    
risposta data 16.07.2012 - 10:31
fonte
5

.Net ha incorporato un pool di thread che puoi usare per fare lavoro. Ma è ancora meglio controllare la libreria parallela Task in .Net 4. Ciò rende molto semplici da implementare gli scenari più comuni per il multithreading. Come utilizzare Parallel.Per da elaborare in parallelo. Utilizzando Task per avvia un lavoro in background e l'attesa perché tutti possano terminare è un altro approccio.

    
risposta data 16.07.2012 - 10:59
fonte

Leggi altre domande sui tag