2010-08-31 96 views
17

如何在线程中停止执行代码如果需要很长时间。我有几个线程一直在工作,但在线程中的代码执行过长之后,应用程序停止响应。30秒后停止在线程中执行代码

是否有可能,如果代码没有在30s内执行,线程将停止执行它并转到下一个代码...所以应用程序仍然活着并且不会停止响应。我正在使用C#.net 3.5

回答

19

我在这里的答案类似于我发布的here

您可以通过在监视线程中等待指定时间的工作线程,然后强制杀死工作线程(如果尚未完成)来完成此操作。请参阅下面的示例代码。

但是,通常情况下,使用Thread.Abort强制查杀线程并不是一个好主意,因为目标线程不一定处于已知状态,并且可能会对可能未释放的资源打开句柄。使用Thread.Abortcode smell

更简洁的方法是更改​​工作线程以管理其自己的生命周期。工作线程可以检查它在已知检查点执行了多长时间,然后在超出某个限制时停止执行。这种方法的缺点是需要在整个线程正在进行的实际工作中分散许多检查点。而且,通过在检查点之间进行太多计算,工作者线程可能很容易超过限制。

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); 
    } 
}