2010-08-31 30 views
17

cách dừng thực thi mã trong chuỗi nếu mất nhiều thời gian. Tôi có vài chủ đề mà làm việc tất cả các thời gian nhưng sau khi mã trong thread đang thực hiện quá dài và ứng dụng ngừng đáp ứng.ngừng thực thi mã trong chuỗi sau 30s

có thể là nếu mã không được thực hiện trong chuỗi 30 sẽ ngừng thực thi nó và đi tới mã tiếp theo ... vì vậy ứng dụng sẽ vẫn còn hoạt động và sẽ không dừng đáp ứng. tôi đang sử dụng C# .net 3.5

Trả lời

19

Câu trả lời của tôi ở đây tương tự như câu trả lời tôi đăng here.

Bạn có thể thực hiện việc này bằng cách đợi chuỗi công nhân của mình từ một chuỗi giám sát trong một khoảng thời gian nhất định và sau đó mạnh mẽ giết chết chuỗi công nhân nếu nó chưa hoàn thành. Xem mã ví dụ bên dưới. Tuy nhiên, nói chung, việc tiêu diệt một luồng mạnh mẽ với Thread.Abort không phải là một ý tưởng tốt vì luồng đích không nhất thiết phải ở trạng thái đã biết và có thể có các chốt mở cho các tài nguyên có thể không được giải phóng. Sử dụng Thread.Abortcode smell.

Cách rõ ràng hơn là thay đổi chuỗi công nhân để quản lý tuổi thọ của chính công ty. Chuỗi công nhân có thể kiểm tra xem nó đã được thực thi tại các trạm kiểm soát nổi tiếng trong bao lâu và sau đó dừng lại nếu nó đã vượt quá giới hạn nào đó. Cách tiếp cận này có nhược điểm là yêu cầu nhiều trạm kiểm soát tiềm năng nằm rải rác trong toàn bộ công việc thực tế mà luồng đang thực hiện. Ngoài ra, chuỗi công nhân có thể dễ dàng vượt quá giới hạn bằng cách thực hiện quá nhiều tính toán giữa các điểm kiểm tra.

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); 
    } 
} 
Các vấn đề liên quan