System.Timers.Timer Interlocked 如何使用?

DMPX 2016-04-03 01:16:19
在Windows Service中调用一个System.Timers.Timer,想实现每天12点定时执行, BonusesManager.Run() 方法中的数据一直重入

private void Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
if (DateTime.Now.ToString("HH:mm:ss") == “00:00:00”)
{
if (Interlocked.Exchange(ref inTimer, 1) == 0)
{
BonusesManager.Run();
Interlocked.Exchange(ref inTimer, 0);
}
}

4 80.00 2016-03-21 00:00:11
3 80.00 2016-03-21 00:00:10
2 80.00 2016-03-21 00:00:09
1 80.00 2016-03-21 00:00:09
4 80.00 2016-03-21 00:00:09
3 80.00 2016-03-21 00:00:08
2 80.00 2016-03-21 00:00:08
1 80.00 2016-03-21 00:00:08

该如何实现多线程加锁?
...全文
243 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
另外,上面其实就事论事地根据你的代码来说一些技术细节。但是真正的技术是能够理解到技术之外的东西,例如windows系统本身就有“计划任务”功能,可以轻松地设置一下windows,何必要自己写定时功能呢?。
  • 打赏
  • 举报
回复
至于说“多线程加锁”,这个玩意儿对你来说太坑爹了。只要在确定的时间去触发一次定时器事件,怎么会纠结上“多线程”呢? 像你那样没事儿情况下每秒也执行多次 Elapsed 委托,不但是浪费了 CPU 资源,而且也是滥用了什么“线程”概念了。
  • 打赏
  • 举报
回复
这个流程是这样的
public void Init(DateTime target)
{
    SetInterval(target);
    Timer.Elapsed += (s, e) =>
    {
        SetInterval(target);
    };
}

private void SetInterval(DateTime target)
{
    Timer.Stop();
    var now = DateTime.Now;
    if (now >= target)
    {
        //定时结束之后,你要执行的代码
        //......................
        SetInterval(DateTime.Now.Date.AddDays(1).AddHours(12));     //第二天12点再执行
    }
    else if (now < target.AddHours(-1))
    {
        Timer.Interval = 3600000;   //1小时后才触发一次定时器
        Timer.Start();
    }
    else
    {
        Timer.Interval = target.Subtract(now).TotalMilliseconds;
        Timer.Start();
    }
}
不要抄代码。代码要能看成是很简单的“大白话”,了解代码背后的逻辑,而不是稀里糊涂的代码。

111,097

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧