C#-系统Timer会自动停止,使用线程进行连续性测试

文章速览

坚持记录实属不易,希望友善多金的码友能够随手点一个赞。
共同创建氛围更加良好的开发者社区!
谢谢~

概述

接上片Timer计时器的文章:C#中System.Threading.Timer的使用

利用周末时间测试了一下System.Threading.Timer的性能,发现两个问题:

1、会出现一些内存泄露的问题,第一天晚上出现了Out of memory的异常,由于是深夜没有第一时间看到线程,早上发现的时候已经中止了,所以还无法完全断定是因为Timer的原因,但后续测试了一下,在跑几个小时后,timer还是会容易出现一些内存泄露的问题,当然我是在里面进行了一些逻辑处理、页面UI的展示和硬件设备的调用;

2、长时间运行后,还是会出现自动停止的现象

故此使用线程进行连续性测试。

代码结构

创建和执行

csharp 复制代码
		//全局变量
        Thread Looper;

        private void btnFatigueTest_Click(object sender, EventArgs e)
        {
            GroupControl(false);
            btn_FatigueCap.Enabled = false;
            btn_StopCap.Enabled = true;
            //硬件执行方法调用

			//创建线程
            Looper = new Thread(new ThreadStart(Loop));
            //执行线程
            Looper.Start();
        }

线程中执行的方法

csharp 复制代码
        int count = 1;
        int count2 = 1;
        bool IsPointB;

        /// <summary>
        /// 循环调用方法
        /// </summary>
        /// <param name="sender"></param>
        private void Loop()
        {
            while (true)
            {
            	//线程睡眠1000ms
                Thread.Sleep(CameraHost.TimeOut);

                string name = IsPointB ? "B" : "A";
                IsPointB = !IsPointB;
                //获取硬件结果
                var filepath = ....
                if (File.Exists(filepath))
                {

                    
                    BeginInvoke(new Action(() => {
                        lb_Count.Text = "次数" + count++;
                    }));
                }
                else
                {
                    MainDeviceProvider.Instance.Logger.Warning($"出错 :{count2++}/{count - 1}");
                }
                //主动GC,系统不一定听你的
 tin               GC.Collect();
            }
        }

停止线程

csharp 复制代码
        private void btn_StopCap_Click(object sender, EventArgs e)
        {
        	//终止线程
            Looper.Abort();

            GroupControl(true);
            count = 1;
            btn_FatigueCap.Enabled = true;
            btn_StopCap.Enabled =  false;
        }

参考文章

C#多线程------Thread睡眠、中断、合并、暂停与恢复、终止

相关推荐
devilnumber5 小时前
Java 递归算法 详解 + 核心要点 + 实战运用 + 避坑指南
java·开发语言·算法
asdfg12589637 小时前
JavaBean是什么?怎么理解?有什么用途?
java·开发语言
dsyyyyy11017 小时前
JavaScript变量
开发语言·javascript·ecmascript
z落落8 小时前
C#WinForm 窗体切换与窗体传值(登录跳转案例)+WinForm 窗体传值(从上往下传、从下往上传)
开发语言·windows·c#
allway28 小时前
How to Echo Multiline to a File in Bash [3 Methods]
开发语言·chrome·bash
weixin_462446238 小时前
手把手教你用 Bash 脚本自动更新 /etc/hosts —— 自动绑定网卡 IP 与节点名
开发语言·tcp/ip·bash
一个梦醒了8 小时前
安装git bash选项推荐
开发语言·git·bash
ct9789 小时前
React 状态管理方案深度对比
开发语言·前端·react
数量技术宅9 小时前
2026量化前沿:从Reddit热帖到Python实战,如何用赫斯特指数(Hurst)狙击虚假突破?
开发语言·python
华如锦9 小时前
面了很多 Java转AI Agent方向,一些面试题总结
java·开发语言·人工智能·python·ai