有关定时的多种方式

一:前言

    很久没有记载东西了,毕业回来之后一个多月都没怎么记载了,今天其实是很巧合的,本来很早以前写的一个定时器,在测试服务器上经常无缘无故的挂掉,进而使得整个服务器都挂掉了,上次弄的客户很不满意,老大就直接把我用quartz的定时器更改了,但是了我当时没怎么仔细看,然后今天我一个同学问我定时器怎么设置90分钟的,我说不行,然后我就想到我们的定时器改了,我就看了看代码,发现已经没有用我的quartz了,我就瞅了下代码。。。然后就。。。

二:定时的方式

     (1)、quartz的定时方式,在我自己的博客里面记载的有,这种方式是需要数据库的。

     (2)、spring task的方式,这个说白了就是交个spring来管理了,所以是不需要数据库的,配置的话差不多,都是大同小异。

     (3)、Timer,这种方式我没有用过,但是我查找了一下,发现是通过监听器和定时器定时来完成某个任务的(http://www.blogjava.net/fastunit/archive/2008/02/15/180116.html)

三:应用

   在使用(1)和(2)中有都有共同的区分

    A:org.springframework.scheduling.quartz.SimpleTriggerBean  这是代表每格指定的时间则触发一次。

<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">  
<property name="jobDetail" ref="job1" />  
<property name="startDelay" value="0" /><!-- 调度工厂实例化后,经过0秒开始执行调度 -->  
<property name="repeatInterval" value="2000" /><!-- 每2秒调度一次 -->  
</bean>  

    B:org.springframework.scheduling.quartz.CronTriggerBean  这是代表每到指定时间触发一次,所以像是我们需要定时时间超过60分钟(比如想定时每90分钟执行一次的话就需要用A方式)

<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">  
<property name="jobDetail" ref="job1" />  
<!—每天12:00运行一次 -->  
<property name="cronExpression" value="0 0 12 * * ?" />  
</bean>  

字段名(项)  必须  值范围  特殊字符 
秒 是 0-59  , - * /  
分 是 0-59  , - * /  
时 是 0-23  , - * /  
月的某天  是 1-31  , - * ? / L W  
月 是 1-12 or JAN-DEC  , - * /  
星期的某天 是 1-7 or SUN-SAT  , - * ? / L #  
年 否 empty, 1970-2099  , - * / 

这篇文章记载的非常详细,觉得讲得不错,相当不错,可以借鉴下http://blog.csdn.net/wilsonke/article/details/26590379。

刚刚朋友又发现一种方式http://my.oschina.net/xldc/blog/297864

  /**
     * 定时卡点计算。每天凌晨 02:00 执行一次
     */
    @Scheduled(cron = "0 0 2 * * *")
    public void autoCardCalculate() {
        System.out.println("定时卡点计算... " + new Date());
    }
 
    /**
     * 心跳更新。启动时执行一次,之后每隔1分钟执行一次
     */
    @Scheduled(fixedRate = 1000*60*1)
    public void heartbeat() {
        System.out.println("心跳更新... " + new Date());
    }
 
    /**
     * 卡点持久化。启动时执行一次,之后每隔2分钟执行一次
     */
    @Scheduled(fixedRate = 1000*60*2)
    public void persistRecord() {
        System.out.println("卡点持久化... " + new Date());
    }

 

四:总结

   最近转去做微信开发了,天天看了文档,微信文档最初看的挺迷迷糊糊的,分配的任务也是研究阿里云oss跨域上传文件下载文件,研究了好久好久,看文档都看了一个多星期,现在希望能把微信搞懂,多一个技能吧,咔咔咔咔咔咔咔。。。。

转载于:https://www.cnblogs.com/wuhao1991/p/4671010.html

01-22 2936
在 WPF 中,可以使用多种方式实现子线程定时刷新页面参数。以下是其中的一些方法: 1. 使用 System.Threading.Timer 类 可以使用 System.Threading.Timer 类来创建一个定时器,以在指定时间间隔后执行某个操作。可以在后台线程中创建并启动定时器,以定期刷新页面参数。例如: ```csharp private System.Threading.Timer timer; // 在窗口加载时启动定时器 private void Window_Loaded(object sender, RoutedEventArgs e) { timer = new System.Threading.Timer(TimerCallback, null, 0, 5000); // 每 5 秒钟执行一次 } // 定时器回调函数 private void TimerCallback(object state) { // 在此处更新页面参数 } ``` 2. 使用 System.Timers.Timer 类 与 System.Threading.Timer 类类似,System.Timers.Timer 类也可以用于创建定时器。不同之处在于,它可以在 UI 线程或后台线程中使用,并提供了更多的配置选项。例如: ```csharp private System.Timers.Timer timer; // 在窗口加载时启动定时器 private void Window_Loaded(object sender, RoutedEventArgs e) { timer = new System.Timers.Timer(5000); // 每 5 秒钟执行一次 timer.Elapsed += TimerElapsed; timer.AutoReset = true; timer.Enabled = true; } // 定时器回调函数 private void TimerElapsed(object sender, ElapsedEventArgs e) { // 在此处更新页面参数 } ``` 3. 使用 Task.Factory.StartNew 方法 可以使用 Task.Factory.StartNew 方法创建一个后台任务,并在其中定期刷新页面参数。例如: ```csharp private CancellationTokenSource tokenSource; // 在窗口加载时启动后台任务 private void Window_Loaded(object sender, RoutedEventArgs e) { tokenSource = new CancellationTokenSource(); Task.Factory.StartNew(() => BackgroundTask(tokenSource.Token), tokenSource.Token, TaskCreationOptions.LongRunning, TaskScheduler.Default); } // 后台任务 private void BackgroundTask(CancellationToken token) { while (!token.IsCancellationRequested) { // 在此处更新页面参数 Thread.Sleep(5000); // 暂停 5 秒钟 } } // 在窗口关闭时取消后台任务 private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) { tokenSource.Cancel(); } ``` 以上是三种常见的实现方式,您可以根据具体需求选择其中的一种。需要注意的是,在多线程环境下更新 UI 元素时,需要使用 Dispatcher.Invoke 或 Dispatcher.BeginInvoke 方法来将更新操作转移到 UI 线程中执行,以避免跨线程访问异常。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值