C#中Timer使用及解决重入问题
2015-07-07 15:07
537 查看
解决方案三个,成功解决timer组件和progressbar更新偶尔死机的问题
1、使用lock(Object)的方法来防止重入,表示一个Timer处理正在执行,下一个Timer发生的时候发现上一个没有执行完就等待执行,适用重入很少出现的场景(具体也没研究过,可能比较占内存吧)。
代码跟上面差不多,在触发的方法中加入lock,这样当线程2进入触发的方法中,发现已经被锁,会等待锁中的代码处理完在执行,代码如下:
2、设置一个标志,表示一个Timer处理正在执行,下一个Timer发生的时候发现上一个没有执行完就放弃(注意这里是放弃,而不是等待哦,看看执行结果就明白啥意思了)执行,适用重入经常出现的场景。代码如下:
3、在多线程下给inTimer赋值不够安全,Interlocked.Exchange提供了一种轻量级的线程安全的给对象赋值的方法(感觉比较高上大,也是比较推荐的一种方法),执行结果与方法2一样,也是放弃执行。Interlocked.Exchange用法参考这里。
1、使用lock(Object)的方法来防止重入,表示一个Timer处理正在执行,下一个Timer发生的时候发现上一个没有执行完就等待执行,适用重入很少出现的场景(具体也没研究过,可能比较占内存吧)。
代码跟上面差不多,在触发的方法中加入lock,这样当线程2进入触发的方法中,发现已经被锁,会等待锁中的代码处理完在执行,代码如下:
相关文章推荐
- Hough线变换
- C#自适应合并文件的方法
- C#第七次作业:学习总结
- C# .ToString() 格式化
- C#第六次作业:猜猜看
- Canny 边缘检测 (Emgu.CV)
- C#学习笔记(六):可空类型、匿名方法和迭代器
- 深入了解C#系列:谈谈C#中垃圾回收与内存管理机制
- 《C#程序设计》猜猜看小游戏制作
- 《C#程序设计》第六次作业:《猜猜看》游戏的原型设计
- C#第五次作业
- C#第二次作业
- C#第一次作业
- c# 判断端口是否被占用
- C# Winform 跨线程更新U…
- C#语法基础和面向对象编程
- [深入学习C#]完成异步委托的三种方式
- C#关于摄像头的使用
- C#调用托管DLL与非托管DLL
- c#的DateTime.Now函数详解