Multi-threading nel servizio Windows C # .NET

7

Sto scrivendo un servizio di Windows (usando C # .NET 3.5 VS2008) e il mio requisito è:

  • All'avvio del servizio di Windows - esegue l'operazione di controllo dei record (nel database) @ ogni intervallo di 30 secondi (ho usato un timer per questo)

  • Se nel database è stato trovato il record appropriato, quindi avvia più thread ed esegue l'operazione richiesta (che può essere operazione di rete o operazione Database).

Il numero di thread multipli dipende anche dalla quantità di record trovati (come se 10 record trovati poi inizino 5 thread e per 20 record iniziano 10 thread ecc ...) Come progettare / codice per questi thread multipli?

Esempio: 10 record trovati nel database, voglio iniziare 5 thread per i primi 5 record che possono eseguire operazioni di rete ... su 5 thread qualsiasi thread completi il suo lavoro - inizierà l'elaborazione per il record successivo (es. numero 6, 7 ... 10)

Si prega di suggerire la migliore soluzione possibile per il caso di cui sopra.

    
posta Ankit Shah 02.06.2011 - 09:45
fonte

3 risposte

4

Suggerirei di usare Parallel.Net e PLINQ invece di multi-threading esplicito. È più facile da gestire, è più leggero e si adatta ai numeri di core che hai

Risorse di apprendimento

link

    
risposta data 03.06.2011 - 10:13
fonte
2

all'avvio del servizio, avvia un thread per eseguire il processo del timer

on service end, kill all open threads

fai attenzione che l'eccezione non gestita qualsiasi nel tuo processo ucciderà silenziosamente il thread del timer

riduci il numero di thread aperti consentiti utilizzando un elenco privato, per evitare di sovraccaricare il servizio

potresti trovare la mia SafeThread classe utile per questo

    
risposta data 02.06.2011 - 10:48
fonte
1

Pensieri iniziali: troppi thread fanno male a te. A meno che il thread non sia legato all'IO (cioè bloccato in attesa di operazioni di I / O per una grande quantità del loro tempo), dovresti avere 2 thread per CPU come una regola empirica.

Come regola, crea un pool di thread con un numero fisso di thread e riutilizzali semplicemente. Il design del pool richiede un semaforo - imposta il conteggio del semaforo per essere il numero di thread nel pool, consenti il numero di richieste con cui il semaforo conta fino a quel momento, quindi il semaforo bloccherà fino al completamento dei thread (quando questo accade, tu decrementa il conteggio dei semafori) che consentirà la successiva richiesta. Questo funziona perché un semaforo è semplicemente un mutex "multi-lock". Passa attraverso tutte le chiamate che hai specificato e poi blocca. Un mutex è in realtà un semaforo con un conteggio di 1.

    
risposta data 02.06.2011 - 10:55
fonte

Leggi altre domande sui tag