2010-08-31 15 views

cevap

19

Benim cevabım ben here yayınlanmıştır birine benzer C# .net kullanıyorum.

Zaman belirli bir süre için bir izleme iş parçacığı adresinin iş parçacığı üzerinde bekleyen ve zaten tamamlamadığı takdirde o zaman zorla işçi iş parçacığı öldürerek yapabilirsiniz. Aşağıdaki örnek koda bakınız. Bununla birlikte, genel olarak, Thread.Abort ile kuvvetli bir şekilde bir iplik parçasının öldürülmesi, hedef ipliğin bilinen bir durumda olması gerekmediğinden ve serbest bırakılmayacak kaynaklara açık tutacaklar olabileceğinden iyi bir fikir değildir. Thread.Abort kullanmak code smell'dur.

temizleyici yolu kendi ömrünü yönetmek için çalışan iş parçacığı değiştirmektir. İşçi ipliği, iyi bilinen kontrol noktalarında ne kadar süre çalışıp çalışmadığını kontrol edebilir ve ardından bir limit aşıldığında durdurabilir. Bu yaklaşım, iş parçacığının gerçekleştirdiği gerçek çalışma boyunca dağılmış potansiyel olarak birçok denetim noktası gerektirme dezavantajına sahiptir. Ayrıca, çalışan iş parçacığı, kontrol noktaları arasında çok fazla hesaplama yaparak bir sınırı kolayca aşabilir.

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); 
    } 
} 
İlgili konular