2010-09-12 13 views
11

Sto lavorando a un progetto che crea 20 ~ 50 nuovi compiti ogni 30 ~ 80 secondi. Ogni attività dura 10 ~ 20 secondi.Riavvia un'attività o creane una nuova?

Così sto usando un Timer per creare questi nuovi compiti, ma ogni volta sempre di ricreare la stessa operazione, il codice è simile a questo:

public class TaskRunner : IDisposable 
{ 
    private readonly Timer timer; 
    public IService service; 

    public ThreadRunner(IService service) { 
      this.service = service; 
      timer = new Timer(10000); 
      timer.Elapsed += Execute; 
      timer.Enabled = true; 
     } 
    } 

    private void Execute(object sender, ElapsedEventArgs e) 
    { 
     try 
     { 
      Task.Factory.StartNew(service.Execute); 
     } 
     catch (Exception ex) 
     { 
      logger.ErrorFormat("Erro running thread {0}. {1}", service, ex); 
     } 
    } 

    public void Dispose() 
    { 
     timer.Dispose(); 
    } 
} 

La mia domanda è, c'è un modo per creare un'attività e continuando a riavviarlo, quindi non ho bisogno di iniziare una nuova attività Task.Factory.StartNew (service.Execute); ogni volta?

O questo è qualcosa che non devo preoccuparmi, e va bene continuare a creare nuovi compiti?

C'è qualche guida/best practice su come devo lavorare su questo scenario, con quel tipo di thread?

+0

Stai utilizzando _Tasks_, non _Threads_. fa la differenza qui. –

+0

'Task.Factory.StartNew' non" avvia un nuovo thread "(in genere) –

+0

Ok, ho capito. La domanda cambia in "dovrei creare una nuova attività ogni volta o posso semplicemente riavviarla?" –

risposta

8

Il metodo Execute è già in esecuzione su un thread. Un thread del threadpool avviato da System.Timers.Timer in uso per generare l'evento Elapsed. Non iniziare un'altra discussione, usa solo quella che ti è stata consegnata. I thread di Threadpool sono molto economici e si riciclano automaticamente.

1

Invece di riavviare ciascuno dei thread quando il timer si attiva, perché non ogni thread esegue un ciclo che esegue il codice specificato alla frequenza richiesta?

7

Alla domanda rivisto:

dovrei creare un nuovo task ogni volta, o posso semplicemente riavviarlo?

La risposta deve essere molto chiara: Sì, utilizzare uno nuovo ogni volta. Non tentare in alcun modo di riutilizzare un'attività, tanto più breve è l'uso, meglio è.

Mentre i thread sono molto costosi da creare, Tasks sta già utilizzando ThreadPoool per risolvere il problema. Non interferire con esso, introdurrai solo problemi.

Problemi correlati