麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

一定間隔時間下重復(fù)執(zhí)行一個函數(shù)的幾個方法

2019-11-14 16:47:02
字體:
供稿:網(wǎng)友

如果有個操作,我們需要過一會兒再做,或者每隔一段時間就要做一次。可以有很多種做法。

獨立線程

是的,對.NET Framework本身一知半解的程序員才會使用這種方案。不過,現(xiàn)實中這個方案其實并不少見。

        public static void Repeat(this Action action, TimeSpan interval)        {            new Thread(new ThreadStart(() =>            {                while(true)                {                    Thread.Sleep(interval);                    action();                }            })).Start();        }

這個方法,相比其他方法,其實還有一個不容小覷的優(yōu)勢:他保證了action只被一個線程調(diào)用,如果這個action沒有再在別的地方用到的話,那么action就是線程安全的。

Timer類

在.Net Framework中,一共有4個Timer類。Joe Albahari在他的《Threading in C#》中對這4個Timer進行了充分的對比分析。我就不再贅述了。

但是Timer類的缺點也很明顯。

l  非線程安全。除了UI上用的兩個Timer類,其它的Timer類都不保證它自己一直是被同一個線程執(zhí)行。當(dāng)然,這種多線程的執(zhí)行方式保證了效率與觸發(fā)事件的時間精度。

l  操作積壓。如果一個Timer,100ms觸發(fā)一次,但是每次卻要執(zhí)行500ms。你可以想象到,你要做的action,本質(zhì)上就變成了以這樣的方式被執(zhí)行著:

            while(true)

                action();

如果是多線程的Timer,情況會更糟糕,你的這個action會被多個線程同時執(zhí)行著。多數(shù)情況下,我們應(yīng)該并不希望事情變成這個樣子。但是很可惜,Timer類可不會管你的EventHandler的執(zhí)行時間是多久,他只是到時間就找個線程把你的action執(zhí)行一次,無論上次action有沒有完成。

l  使用不便。想想我們要做什么:“延遲或定時執(zhí)行一個函數(shù)。”,再來看看需要寫的代碼,我覺得相對于要做的操作而言,過于復(fù)雜了。

            Timer timer = new Timer(1000);            timer.Elapsed += (sender, e) => action();            timer.Start();            // 不需要的時候            timer.Dispose();

再想想,如果你同時要保證線程安全和避免操作積壓,又有多少代碼要寫?于是,Quartz.NET誕生了,以簡化這類定時執(zhí)行操作的代碼。

Reactive Extension

事情就可以被簡化成:

         Observable.Interval(interval).Subscribe(i => action());

上面的代碼的行為與使用Timer類時的行為一樣,有操作積壓問題。解決方法有很多。這里給出一個我覺得最簡單的。

        public static void Repeat(this Action action, TimeSpan interval)        {            Observable.Defer(action.ToAsync())                      .DelaySubscription(interval)                      .Repeat().Subscribe();        }

上面的方法,保證了每次action執(zhí)行之間的時間間隔是一定的。所以不會有action積壓的問題出現(xiàn)。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 久久精热 | 国内精品久久久久久久久久久久 | 成人福利电影在线观看 | 国产精品久久久久永久免费 | 国产精品视频久久久 | 国产精品自拍99 | 老女人碰碰在线碰碰视频 | 一级电影在线免费观看 | 日本在线免费观看 | 一夜新娘第三季免费观看 | 99激情视频 | 在线看免费的a | 国产精品99一区二区 | 中日无线码1区 | 国产免费一区二区三区视频 | 成人三级电影网 | 国产免费一级淫片 | www.射| 欧美人与性禽动交精品 | www.91pron | 一本一本久久a久久精品综合小说 | 操你视频| 国产亚洲欧美视频 | 久久久婷婷一区二区三区不卡 | 国产妇女乱码一区二区三区 | 91色一区二区三区 | 一本色道久久综合狠狠躁篇适合什么人看 | 久久蜜臀一区二区三区av | 日韩大片在线永久观看视频网站免费 | 黄色大片在线免费看 | 久久精热| 国内精品久久久久久久星辰影视 | hd性videos意大利复古 | 一级黄色影院 | 久久精品视频69 | 午夜视频观看 | 色视频一区二区 | 日韩中文字幕一区二区三区 | 免费一级片观看 | 99精品视频一区二区三区 | 国产99久久精品一区二区 |