2010-08-31 14 views
17

come interrompere l'esecuzione del codice nel thread se richiede troppo tempo. Ho pochi thread che funzionano tutto il tempo, ma dopo un po 'di tempo, mentre il codice nel thread è in esecuzione troppo a lungo e l'applicazione smette di rispondere.interrompe l'esecuzione del codice nella discussione dopo 30s

è possibile che se il codice non viene eseguito in 30s il thread interromperà l'esecuzione e passerà al codice successivo ... quindi l'applicazione sarà ancora attiva e non smetterà di rispondere. sto usando C# .net 3.5

risposta

19

La mia risposta qui è simile a quella che ho postato here.

È possibile eseguire questa operazione attendendo il thread di lavoro da un thread di monitoraggio per un periodo di tempo specificato e quindi uccidendo forzatamente il thread di lavoro se non è già stato completato. Vedi il codice di esempio qui sotto.

In generale, tuttavia, l'eliminazione forzata di un thread con Thread.Abort non è una buona idea poiché il thread di destinazione non è necessariamente in uno stato noto e potrebbe disporre di handle aperti per risorse che potrebbero non essere liberate. L'utilizzo di Thread.Abort è un code smell.

Il modo più semplice è modificare il thread di lavoro per gestirne la durata. Il thread di lavoro può controllare quanto tempo è stato eseguito a punti di controllo noti e poi fermarsi se ha superato qualche limite. Questo approccio ha l'inconveniente di richiedere potenzialmente molti punti di controllo sparsi per il lavoro effettivo svolto dal thread. Inoltre, il thread di lavoro potrebbe facilmente superare un limite eseguendo troppi calcoli tra i checkpoint.

class Program 
{ 
    static void Main(string[] args) 
    { 
     if (RunWithTimeout(LongRunningOperation, TimeSpan.FromMilliseconds(3000))) 
     { 
      Console.WriteLine("Worker thread finished."); 
     } 
     else 
     { 
      Console.WriteLine("Worker thread was aborted."); 
     } 
    } 

    static bool RunWithTimeout(ThreadStart threadStart, TimeSpan timeout) 
    { 
     Thread workerThread = new Thread(threadStart); 

     workerThread.Start(); 

     bool finished = workerThread.Join(timeout); 
     if (!finished) 
      workerThread.Abort(); 

     return finished; 
    } 

    static void LongRunningOperation() 
    { 
     Thread.Sleep(5000); 
    } 
} 
Problemi correlati