文章导航PC6首页软件下载单机游戏安卓资源苹果资源

pc软件新闻网络操作系统办公工具编程服务器软件评测

安卓新闻资讯应用教程刷机教程安卓游戏攻略tv资讯深度阅读综合安卓评测

苹果ios资讯苹果手机越狱备份教程美化教程ios软件教程mac教程

单机游戏角色扮演即时战略动作射击棋牌游戏体育竞技模拟经营其它游戏游戏工具

网游cf活动dnf活动lol周免英雄lol礼包

手游最新动态手游评测手游活动新游预告手游问答

您的位置:首页技术开发.Net 专栏 → .Net下跟踪线程挂起和程序死循环

.Net下跟踪线程挂起和程序死循环

时间:2010/2/15 18:12:00来源:本站整理作者:我要评论(0)

.Net下跟踪线程挂起和程序死循环:

   .Net 下的程序调试相对C/C++要简单很多,少了那些令人头疼的指针越界的问题。不过当你的程序遇到如下问题时,依然非常棘手:

   1. 进程异常终止。

   2. 内存泄漏或者内存申请后程序始终没有释放。解决方案见 用 .NET Memory Profiler 跟踪.net 应用内存使用情况--基本应用篇  。

   3. 线程因未知原因挂起,比如死锁。

   4. 程序死循环。

   本文将阐述如果编写程序对后两者故障实时跟踪并报告。

   首先我们需要一个单独的监控线程来监控需要监控的线程

   我做了一个监控类 ThreadMonitor,在开始监控之前,我们将监控线程的优先级设置为最高。

        public ThreadMonitor()
        {
            _MonitorThread = new Thread(new ThreadStart(MonitorTask));
            _MonitorThread.Priority = ThreadPriority.Highest;
            _MonitorThread.IsBackground = true;

        }

   接下来我们为这个线程提供几个公共方法

  Start  方法让调用者启动监控

  Register 方法用于将需要监控的线程注册到监控列表中

  Heartbeat 方法后面说明

        /**//// <summary>
        /// Start monitor
        /// </summary>
        public void Start()
        {
            _MonitorThread.Start();
        }


        /**//// <summary>
        /// Monitor register
        /// </summary>
        /// <param name="monitorPara">Monitor parameter</param>
        public void Register(MonitorParameter monitorPara)
        {
            Debug.Assert(monitorPara != null);
            Debug.Assert(monitorPara.Thread != null);

            if (GetTCB(monitorPara.Thread) != null)
            {
                throw new System.ArgumentException("Register repeatedly!");
            }

            lock (_RegisterLock)
            {
                _TCBTable.Add(monitorPara.Thread.ManagedThreadId, new TCB(monitorPara));
            }
        }

        public void Heartbeat(Thread t)
        {
            TCB tcb = GetTCB(t);
            if (tcb == null)
            {
                throw new System.ArgumentException("This thread was not registered!");
            }

            tcb.LastHeartbeat = DateTime.Now;
            tcb.HitTimes = 0;
            tcb.Status &= ~ThreadStatus.Hang;
        }

相关视频

    没有数据

相关阅读 Win8下无法升级.NET Framework 3.5.1的解决方法Windows系统运行库集合下载 - VC运行库,.NET DirectX库vs.netIDE报"以下文件中的行尾不一致,要将行尾标准化吗?"的解决ie6下面asp.net mvc3 部署应用程序.NET 3.5 安装错误的四个原因及解决方法支持无限制历史记录的Paint.NET 3.5.8 Final,你用了吗?.NET Framework环境安装错误怎么办?Java开发者要了解多少脚本语言,能实现.NET中的效率?

文章评论
发表评论

热门文章 没有查询到任何记录。

最新文章 什么是.NET中的TDD?ASP.NET AJAX入门简介 WebMatrix入门教程VC++2008中如何调用GetOpenFileName打开文件PlaySound函数在VC++6.0中如何播放音乐及声请问VC++回调函数怎么用

人气排行 嵌入式实时操作系统VxWorks入门教程ArrayList 与 string、string[] 的转换C#遍历整个文件夹及子目录的文件代码WebMatrix入门教程asp.net判断文件或文件夹是否存在c#判断数据NULL值的方法vc++6.0怎么写Windows简单窗口代码.net解决数据导出excel时的格式问题