第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定

C#的System.Timers.Timer

標(biāo)簽:
C

摘要

之前学习过c#中定时器Timer的基本用法,在使用过程中,有一个问题,一直困扰着自己,就是在初始化定时器的时候,如果设置的interval过小,或者每次执行的业务非常耗时的时候,这时候该怎么处理?第一次还没执行结束,下一次已经触发了。

一个例子

如果设置的interval比较大,而业务执行过程耗时很小,如下所示:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Timers;
namespace TimerTest
{    class Program
    {        static Timer timer = new Timer();        static void Main(string[] args)
        {

            timer.Interval = 1000;
            timer.AutoReset = true;
            timer.Enabled = true;
            timer.Elapsed += timer_Elapsed;
            Console.Read();
        }        static int count = 1;        
        static void timer_Elapsed(object sender, ElapsedEventArgs e)
        {
            Console.WriteLine("第{0}次触发", count.ToString());            
            if (count == 10)
            {
                timer.Enabled = false;
            }
            Console.WriteLine("当前线程:" + System.Threading.Thread.CurrentThread.ManagedThreadId);
            System.Threading.Thread.Sleep(10);
            Console.WriteLine("第{0}次处理完成", count.ToString());
            count++;

        }
    }
}

执行过程

但实际中由于业务非常复杂,执行很耗时

System.Threading.Thread.Sleep(2000);

可以看到这是,已经开始乱了,线程id已经变了,如果在里面涉及到引用的类型,必然引起多个线程修改同一个变量的问题,造成并不是我们想要的结果。

当然,这个时候有很多处理方法,加锁,或者设置标致量,等本次运行结束时,再运行下一次的。但这种方式,会造成timer的空转。

加锁

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Timers;
namespace TimerTest
{    class Program
    {        static readonly object obj = new object();        
             static Timer timer = new Timer();
             static void Main(string[] args)
        {

            timer.Interval = 1000;
            timer.AutoReset = true;
            timer.Enabled = true;
            timer.Elapsed += timer_Elapsed;
            Console.Read();
        }        static int count = 1;
                static void timer_Elapsed(object sender, ElapsedEventArgs e)
        {            lock (obj)
            {
                Console.WriteLine("第{0}次触发", count.ToString());                
                if (count == 10)
                {
                    timer.Enabled = false;
                }
                Console.WriteLine("当前线程:" + System.Threading.Thread.CurrentThread.ManagedThreadId);
                System.Threading.Thread.Sleep(2000);
                Console.WriteLine("第{0}次处理完成", count.ToString());
                count++;
            }
            
        }
    }
}


执行

标志量

        static void timer_Elapsed(object sender, ElapsedEventArgs e)
        {            if (isRunning)
            {
                isRunning = false;
                Console.WriteLine("第{0}次触发", count.ToString());                if (count == 10)
                {
                    timer.Enabled = false;
                }
                Console.WriteLine("当前线程:" + System.Threading.Thread.CurrentThread.ManagedThreadId);
                System.Threading.Thread.Sleep(2000);
                Console.WriteLine("第{0}次处理完成", count.ToString());
                count++;
                isRunning = true;
            }

        }


但仍有另外一种方式,可以在当前处理业务的时候,将当前的timer先停止,执行完毕之后开启。

        static void timer_Elapsed(object sender, ElapsedEventArgs e)
        {
            timer.Enabled = false;          
            if (count == 10)
            {
                timer.Enabled = false;                return;
            }
            Console.WriteLine("第{0}次触发", count.ToString());
            Console.WriteLine("当前线程:" + System.Threading.Thread.CurrentThread.ManagedThreadId);
            System.Threading.Thread.Sleep(2000);
            Console.WriteLine("第{0}次处理完成", count.ToString());
            timer.Enabled = true;
            count++;
        }

总结

可以尝试测试开启100个定时器甚至更多的进行测试比较,推荐使用处理业务之前关闭,处理结束之后开启的方式。

點(diǎn)擊查看更多內(nèi)容
TA 點(diǎn)贊

若覺(jué)得本文不錯(cuò),就分享一下吧!

評(píng)論

作者其他優(yōu)質(zhì)文章

正在加載中
  • 推薦
  • 評(píng)論
  • 收藏
  • 共同學(xué)習(xí),寫(xiě)下你的評(píng)論
感謝您的支持,我會(huì)繼續(xù)努力的~
掃碼打賞,你說(shuō)多少就多少
贊賞金額會(huì)直接到老師賬戶(hù)
支付方式
打開(kāi)微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊(cè)有機(jī)會(huì)得

100積分直接送

付費(fèi)專(zhuān)欄免費(fèi)學(xué)

大額優(yōu)惠券免費(fèi)領(lǐng)

立即參與 放棄機(jī)會(huì)
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)

舉報(bào)

0/150
提交
取消