问题背景

  C#小白,由于本公司IM系统服务端(java)是本人独立开发的,加上现在所在项目需要对接IM系统,于是IM的客户端(C#实现)对接工作就交给我了。于是C#小白的我天真的以为只要调用C#端的SDK接口真搞定了。起初都还好,对接工作都很正常,没什么大问题。可是随着时间的不断流逝,终于在项目组小伙伴的不断使用中发现经常登不上IM系统,然而让我过去调试的时候又发现是正常的,让人很抓狂有木有!

  直到他们再次重现BUG给我看的时候,我发现服务端日志中不断收到登录请求,而且他们程序关闭之后还是这样,小伙伴们百思不得其解,都怀疑我的服务端代码有问题。对服务端代码很熟悉的我自然不会认为服务端会有什么问题,因为登录只有收到客户端的UDP请求才会触发,而客户端不断发送登录请求这种情况也只有客户端自动重连机制了。而客户端正常退出时 根本不会触发自动重连机制,因为正常退出时会发出登出请求,并且会释放自动重连,心跳以及QoS等资源,那就只有异常退出时可能会出现这种问题了,如:任务管理器强制杀死程序、程序卡死、闪退等情况,他们在开发调试的时候也经常通过IDE直接关闭。于是我做了一个实验,在客户端登录成功后,反复n次正常登陆登出,没有任何问题;然后又尝试了异常退出,虽然没有立即登出IM系统(没发登出请求嘛),但也不会出现疯狂重连的情况,当然10s没有心跳服务器自然认为用户掉线了,一切正常;下面开始重头戏了,我改了客户端SDK的代码,在登陆成功后直接调用自动重连机制,然后任务管理器强制杀死程序,果不其然,BUG重现了。。。

问题探究

  问题已经很明确了,非正常情况下的程序关闭并且自动重连程序在执行中的时候服务端会不断收到登录请求。到底是什么原因导致的呢?于是我不(忐)慌(忑)不忙(安)的去看了下客户端SDK中自动重连部分的代码,这里主要依靠timer定时器每隔2s发一次登录请求,直到登录成功为止。琢磨了一会儿也没发现有什么问题,慢慢的我开始猜测会不会是这timer有问题?于是把timer换成了Thread,通过Thread.sleep(2000)加是否重连成功的状态位来达到定时的效果,然后心怀期待的去测试,依然是在登陆成功后直接调用自动重连机制,然后任务管理器强制杀死程序,BUG消失了。一时兴奋的我多测试了几次,终于可以确定是timer的问题了,欣喜若狂的我心里不免开始了咒骂,哪有进程都杀死了,线程还在跑的道理嘛!!!

解决问题

  C#中的timer定时器分为三种:基于服务器的计时器System.Timers.Timer、线程计时器System.Threading.Timer以及基于 Windows 的标准计时器System.Windows.Forms.Timer。其中第一种和第二种都是通过threadpool新开一个线程,因此效率较高;而第三种则是通过windows消息机制实现,和它所属的Form属于同一个线程,故效率较低。由于IM是不依赖于窗体的,属于后台独立线程,故排除第三种的使用可能。而IMSDK中使用的是第一种System.Timers.Timer而出现的问题,故我选择使用第二种线程计时器System.Threading.Timer来代替,经过大量测试后,完美解决问题,故记录一番。

  至于System.Timers.Timer为什么会出现这种情况,在下学疏才浅,实在不知道为什么,希望知道的大神能点拨一二,不胜感激!

C# System.Timers.Timer中的坑,程序异常退出后timer依然运行问题的更多相关文章

  1. 使用System.Timers.Timer类实现程序定时执行

    使用System.Timers.Timer类实现程序定时执行 在C#里关于定时器类有3个:System.Windows.Forms.Timer类.System.Threading.Timer类和Sys ...

  2. .NET中System.Diagnostics.Stopwatch、System.Timers.Timer、System.Threading.Timer 的区别

    1.System.Diagnostics.Stopwatch Stopwatch 实例可以测量一个时间间隔的运行时间,也可以测量多个时间间隔的总运行时间. 在典型的 Stopwatch 方案中,先调用 ...

  3. .NET System.Timers.Timer的原理和使用(开发定时执行程序)

    概述(来自MSDN) Timer 组件是基于服务器的计时器,它使您能够指定在应用程序中引发Elapsed 事件的周期性间隔.然后可以操控此事件以提供定期处理.例如,假设您有一台关键性服务器,必须每周7 ...

  4. 简述System.Windows.Forms.Timer 与System.Timers.Timer用法区别

    System.Windows.Forms.Timer 基于窗体应用程序 阻塞同步 单线程 timer中处理时间较长则导致定时误差极大. System.Timers.Timer 基于服务 非阻塞异步 多 ...

  5. System.Timers.Timer

    前言 System.Timers.Timer组件是基于服务器的计时器,它能够指定在应用程序中引发Elapsed事件周期性间隔,以处理相应事件. 使用示例: 运行结果展示: System.Timers. ...

  6. C# System.Timers.Timer的一些小问题?

    比如设置间隔时间是 1000msSystem.Timers.Timer mytimer = new System.Timers.Timer(1000);问题若响应函数执行的时间超过了 1000 ms, ...

  7. [C#]System.Timers.Timer

    摘要 在.Net中有几种定时器,最喜欢用的是System.Timers命名空间下的定时器,使用起来比较简单,作为定时任务,有Quartz.net,但有时候,一个非常简单的任务,不想引入这个定时任务框架 ...

  8. System.Windows.Forms.Timer与System.Timers.Timer的区别(zz)

    .NET Framework里面提供了三种Timer: System.Windows.Forms.Timer System.Timers.Timer System.Threading.Timer VS ...

  9. .Net Windows Service(服务) 调试安装及System.Timers.Timer 使用

    Windows Service(服务)  是运行在后台的进程 1.VS建立 Windows 服务(.NET Framework) 2.添加Timer 双击Service1.cs可以拖控件(System ...

随机推荐

  1. OSG实现正八面体剖分成球

    #include<Windows.h> #include<osg/Node> #include<osg/Geode> #include<osg/Group&g ...

  2. PKUWC 2018 真实排名

    PKUWC2018 真实排名 题面描述 共有\(n\)个人,每个人有一个能力值,每个人的排名为所有能力值不比他小的人的个数(包括他自己). 现在有\(k\)个人能力值翻倍,但我们无法得知是哪\(k\) ...

  3. 全面解析Spring中@ModelAttribute注解的用法

    本文不再更新,可能存在内容过时的情况,实时更新请移步我的新博客:全面解析Spring中@ModelAttribute注解的用法: @ModelAttribute注解用于将方法的参数或方法的返回值绑定到 ...

  4. Python :route的用法以及Http方法

    现代 Web 应用的 URL 十分优雅,易于人们辨识记忆,这一点对于那些面向使用低速网络连接移动设备访问的应用特别有用.如果可以不访问索引页,而是直接访问想要的那个页面,他们多半会笑逐颜开而再度光顾. ...

  5. JZOJ5966【NOIP2018提高组D2T3】保卫王国(并查集)

    题目 还是懒得把题目放上来了. 大意:给你一棵带点权的树,你要花费一些代价选择一些点使得相邻的两个点至少有一个被选. 然后有很多个询问,每个询问强制两个点的状态,问强制了这两个点的状态后的方案. 比赛 ...

  6. iType.js仿输入文字效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. spark dataframe 将null 改为 nan

    由于我要叠加rdd某列的数据,如果加数中出现nan,结果也需要是nan,nan可以做到,但我要处理的数据源中的nan是以null的形式出现的,null不能叠加,而且我也不能删掉含null的行,于是我用 ...

  8. Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---模板方法模式之CoffeineBeverageWithHook[转]

    模板方法模式定义了一个算法骨架,允许子类对算法的某个或某些步骤进行重写(override).   1   2{<HeadFirst设计模式>之模板方法模式 }   3{ 编译工具: Del ...

  9. Session - 什么叫一次会话

    转载自:https://blog.csdn.net/qin_xiaofang/article/details/77725946 网上收集的:Session代表服务器与浏览器的一次会话过程,这个过程是连 ...

  10. 科普 | 编译 V8 源码

    2017-02-13 justjavac 象尘说 对于JavaScript程序员来说,可以瞧一瞧justjavac给大家写的科普类读物,V8引擎的分析,“也许你不懂C++”,但是你可以了解一下,总是好 ...