30秒后停止在线程中执行代码

时间:2010-08-31 08:37:27

标签: c#

如果需要很长时间,如何停止在线程中执行代码。我有一些线程一直在工作,但是在线程中的代码执行太长而应用程序停止响应之后。

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

1 个答案:

答案 0 :(得分:23)

我的回答类似于我发布的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);
    }
}