.net 线程监控

2024-03-12

我想从另一个线程监视一个线程。当前正在查看 thread.isalive 属性。如果线程中有任何异常,thread.isalive 属性仍然为 true。

如果线程中有任何异常或者线程处于无限循环中,我想杀死线程。

感谢您的意见/解决方案/建议。

Raju


听起来受监视的线程正在捕获它抛出的异常,否则,它会终止并可能也会导致整个进程停止运行。您可以订阅AppDomain.FirstChanceException http://msdn.microsoft.com/en-us/library/dd997368.aspx事件来确定最初抛出异常的时间,但即使发生这种情况,您也不一定要终止线程(如果线程捕获异常、处理异常并正常继续执行怎么办?)。相反,请考虑让异常“正常”终止线程,然后在监视器代码中捕获它以防止它停止进程。

无法判断线程是否处于无限循环中,但您可以终止运行时间过长的线程(请参见下面的示例代码)。强制终止线程Thread.Abort但是,可能会导致问题并且有代码味道(请参阅here http://msmvps.com/blogs/peterritchie/archive/2007/08/22/thead-abort-is-a-sign-of-a-poorly-designed-program.aspx)。您应该考虑更改工作线程以管理其自身的生命周期。

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);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.net 线程监控 的相关文章

随机推荐