C#在新建线程中使用Timer无效问题及解决

目录
  • 在新建线程中使用Timer无效
    • 第一步
    • 第二步
  • C# Timer无法停止的解决
    • 问题果然解决了

在新建线程中使用Timer无效

在C#winform窗体设计中,我们像重复运行某一功能时,我们想到的就是使用C#的Timer控件,但如果这个功能执行一次需要较长时间时,就会占用UI线程,从而会出现窗体上的控件无法选中或点击。这个问题可以通过多线程来解决,但在多线程中,会出现timer控件无效的问题。

首先,我们在窗体设计页面上选择的timer控件,是属于System.Windows.Forms.Timer类,这个类是无法在开辟的新线程中使用的。

若想在thread中使用,我们要用到System.Timers.Timer类的timer定时器,具体操作如下。

第一步

添加System.Timers.Timer模块和线程模块

using System.Timers;
using System.Threading;

第二步

新建一个 System.Timers类的timer定时器和新线程

// 新建一个System.Timers类的定时器
System.Timers.Timer timer = new System.Timers.Timer();
timer.Interval = 100; // 定时器的运行周期(ms)
timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed); // 添加调用函数

void timer2_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
    // 定时器执行的语句
}

Thread t1 = new Thread(new ThreadStart(t1_Run)); // 实例化新线程
t1.Start();

private void t1_Run()
{
    timer2.Enabled = true; // 定时器开启
}

C# Timer无法停止的解决

在用Winform做一个网络爬虫的时候发现C#里头Timer调用Stop()函数却无停止的问题。

在网上找,似乎说问题与线程池有关。我对线程的使用很不熟练,所以也看不明白网上调用线程的方法。

还好在一篇帖子的回复里找到了一个简单的解决方法,就是在Elapse调用的方法里一开始就调用timer.stop(),结尾再调用一次timer.start();

问题果然解决了

public void main(){
    myTimer = new System.Timer.Timer(LOOP_INTERVAL);
    myTimer.Elapsed += new System.Timers.ElapsedEventHandler(myElapse);
    myTimer.Enabled = true; //myTimer启动
}
public void myElapse(object sender, System.Timers.ElapsedEventArgs e){
    myTimer.Stop();
    ...
    myTimer.Start();
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • C#中三种Timer计时器的详细用法

    一.基于 Windows 的标准计时器(System.Windows.Forms.Timer) 首先注意一点就是:Windows 计时器是为单线程环境设计的.它直接继承自Componet. Timer控件只有绑定了Tick事件和设置Enabled=True后才会自动计时,停止计时可以用Stop()方法控制,通过Stop()停止之后,如果想重新计时,可以用Start()方法来启动计时器. Timer控件和它所在的Form属于同一个线程,在这种Timer的EventHandler中可以直接获取和修改

  • C#中Forms.Timer、Timers.Timer、Threading.Timer的用法分析

    本文实例讲述了C#中Forms.Timer.Timers.Timer.Threading.Timer的用法分析,分享给大家供大家参考.具体分析如下: 在.NET Framework里面提供了三种Timer ① System.Windows.Forms.Timer ② System.Timers.Timer ③ System.Threading.Timer 现分述如下: 一.System.Windows.Forms.Timer 1.基于Windows消息循环,用事件方式触发,在界面线程执行:是使用

  • C#中的三种定时计时器Timer用法介绍

    在.NET中有三种计时器: 1.System.Windows.Forms命名空间下的Timer控件,它直接继承自Componet.Timer控件只有绑定了Tick事件和设置Enabled=True后才会自动计时,停止计时可以用Stop()方法控制,通过Stop()停止之后,如果想重新计时,可以用Start()方法来启动计时器.Timer控件和它所在的Form属于同一个线程: 2.System.Timers命名空间下的Timer类.System.Timers.Timer类:定义一个System.T

  • C#中Timer使用及解决重入问题

    ★前言 打开久违的Live Writer,又已经好久没写博客了,真的太懒了.废话不多说了,直接进入这次博客的主题--Timer.为什么要写这个呢,因为前几天应朋友之邀,想做个"黑客"小工具,功能挺简单就是自动获取剪贴板的内容然后发送邮件,就需要用到Timer来循环获取剪贴板的内容,但是由于到了发送邮件这个功能,使用C#的SmtpClient始终发送不了邮件,以前写过类似发邮件的功能,当时可以用网易的,现在也不能用了,不知道咋回事,只好作罢.在使用Timer中遇到了之前没有想过的问题--

  • C#在新建线程中使用Timer无效问题及解决

    目录 在新建线程中使用Timer无效 第一步 第二步 C# Timer无法停止的解决 问题果然解决了 在新建线程中使用Timer无效 在C#winform窗体设计中,我们像重复运行某一功能时,我们想到的就是使用C#的Timer控件,但如果这个功能执行一次需要较长时间时,就会占用UI线程,从而会出现窗体上的控件无法选中或点击.这个问题可以通过多线程来解决,但在多线程中,会出现timer控件无效的问题. 首先,我们在窗体设计页面上选择的timer控件,是属于System.Windows.Forms.

  • C#向线程中传递多个参数的解决方法(两种)

    问题: 对于多线程编程,很多时候往往需要向线程中传递多个参数,而C#中的线程只接收1个object类型的参数(如下): Thread t = new Thread(new ParameterizedThreadStart(newthread)); t.start(参数); void newthread(object) { ............. } 而现在需要往线程中传递多个参数,比如method方法想用单独的线程来跑 void method(int begin,int end) { ...

  • IDEA中sout快捷键无效问题的解决方法

    新手当在一个类文件中进行了一些操作之后,会造成sout快捷命令无法自动生成.比如操作了import引入其它包之后.主要是对IDEA操作的不熟悉. 解决办法打开file-settings 找到Editor - Live Templates - 右边打开JAVA下面的三角形,找到sout 选择左下方的 Change 将JAVA下面的全选 回到IDEA 就可以使用sout了 到此这篇关于IDEA中sout快捷键无效问题的文章就介绍到这了,更多相关IDEA中sout快捷键无效内容请搜索我们以前的文章或继

  • 解决Spring在Thread中注入Bean无效的问题

    目录 在Thread中注入Bean无效 错误的注入方法 通过封装Thread子类注入 通过外部引入 Spring多线程中bean的注入问题 网上的主要解决方法有 在Thread中注入Bean无效 在Spring项目中,有时需要新开线程完成一些复杂任务,而线程中可能需要注入一些服务.而通过Spring注入来管理和使用服务是较为合理的方式.但是若直接在Thread子类中通过注解方式注入Bean是无效的. 因为Spring本身默认Bean为单例模式构建,同时是非线程安全的,因此禁止了在Thread子类

  • C#中的timer与线程使用

    目录 C#的timer与线程使用 timer有3种 C#新线程延时 开启一个新线程 C#的timer与线程使用 卡顿怎么处理,多线程.多线程比timer好读.看看timer和线程的关系. timer有3种 1.winform 下的timer.就是拖控件到UI上的那个timer. 源文件在这个路径下C:\Windows\Microsoft.NET\Framework64\v4.0.30319 namespace System.Windows.Forms {     // 摘要:    实现按用户定

  • python通过线程实现定时器timer的方法

    本文实例讲述了python通过线程实现定时器timer的方法.分享给大家供大家参考.具体分析如下: 这个python类实现了一个定时器效果,调用非常简单,可以让系统定时执行指定的函数 下面介绍以threading模块来实现定时器的方法. 使用前先做一个简单试验: import threading def sayhello(): print "hello world" global t #Notice: use global variable! t = threading.Timer(5

  • .NET中的Timer类型用法详解

    在.NET FrameWork中有多个Timer,那么怎么根据实际情况进行选择确实是一个问题. 总体而言,计时器共有以下四种: 多线程计时器: 1 System.Threading.Timer 2 System.Timers.Timer 特殊环境的单线程计时器: 1 System.Windows.Forms.Timer(使用环境:Windows Forms Timer) 2 System.Windows.Threading.DispatcherTimer( 使用环境:WPF timer); 单线

  • Android使用Sensor感应器实现线程中刷新UI创建android测力计的功能

    本文实例讲述了Android使用Sensor感应器实现线程中刷新UI创建android测力计的功能.分享给大家供大家参考,具体如下: 前面一篇<Android基于Sensor感应器获取重力感应加速度的方法>我们介绍了sensor的基本知识以及一个使用其中加速度感应器获取数据的例子. 前面提到过一个问题,就是说感应器刷新频率太快,假如我们要做一个UI中,需要根据方向数据绘制一个一个移动的箭头,那么就要太过频繁的刷新绘制界面,占用很多的资源,体验性也会很差,<android 2高级编程>

  • 解析Java中的Timer和TimerTask在Android中的用法和实例

    在开发中我们有时会有这样的需求,即在固定的每隔一段时间执行某一个任务.比如UI上的控件需要随着时间改变,我们可以使用Java为我们提供的计时器的工具类,即Timer和TimerTask. Timer是一个普通的类,其中有几个重要的方法:而TimerTask则是一个抽象类,其中有一个抽象方法run(),类似线程中的run()方法,我们使用Timer创建一个他的对象,然后使用这对象的schedule方法来完成这种间隔的操作. schedule方法有三个参数 第一个参数就是TimerTask类型的对象

随机推荐