有效期是怎么实现的

fantasykakaxi 2017-12-26 01:58:04
有效期是120s。
我用的最笨的方法。
DateTime dtStart = DateTime.Now;
DateTime dtEnd = DateTime.Now.AddMinutes(2);
然后在for里面循环 函数

请问大神们 你们聪明的写法是怎么写?
用timer?
...全文
769 35 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
xinbada1985 2017-12-28
  • 打赏
  • 举报
回复
如果想停止就把timer设为全局变量,stop一下就可以了
xinbada1985 2017-12-28
  • 打赏
  • 举报
回复
public MainWindow() { InitializeComponent(); DispatcherTimer deactivatedTimer = new DispatcherTimer(); mousePositionTimer.Tick += new EventHandler(MousePositionTimedEvent); mousePositionTimer.Interval = new TimeSpan(0, 0, 1); //每隔1秒检测一次 mousePositionTimer.Start(); } private void MousePositionTimedEvent(object sender, EventArgs e) { if (expiredTime > DateTime.Now) { //处理事件 } } timer 的方法
xinbada1985 2017-12-28
  • 打赏
  • 举报
回复
引用 13 楼 fantasykakaxi 的回复:
[quote=引用 12 楼 hanjun0612 的回复:] [quote=引用 11 楼 fantasykakaxi 的回复:] @hanjun0612 @closurer 我需要在有效期内不断查询 我首先就想到了循环 你们说的这个缓存设置一个有效期 我不太明白 还望大神普及一下 我现在的思路就是 start 一直在变 跟end对比 小于就不断查询 大于就跳出 我想用高效率的 不想用笨办法 还望大神帮助
给一个简单的实例代码。

//模型
public class User
        {
            public int id { get; set; }
            public virtual string name { get; set; }
            public virtual string buyer { get; set; }
            public virtual string idArr { get; set; }
            public virtual DateTime expiredTime { get; set; }
        }

        static void Main(string[] args)
        {
            //为了快一点我就设置了3秒过期
            User u = new User() { id = 1, name = "n1", expiredTime = DateTime.Now.AddSeconds(3) };

            //方法1
            //直接时间判断
            while (true)
            {
                Thread.Sleep(1000);
                Console.WriteLine("是否过期:" + (u.expiredTime > DateTime.Now));
            }

            //方法2
            //缓存   using System.Runtime.Caching;
            MemoryCache mc = new MemoryCache("test");
            mc.Set(u.id.ToString(), u, u.expiredTime);
            while (true)
            {
                Thread.Sleep(1000);
                Console.WriteLine("是否过期:" + mc.Get(u.id.ToString()));
            }

            Console.ReadLine();
        }
[/quote]
引用 12 楼 hanjun0612 的回复:
[quote=引用 11 楼 fantasykakaxi 的回复:] @hanjun0612 @closurer 我需要在有效期内不断查询 我首先就想到了循环 你们说的这个缓存设置一个有效期 我不太明白 还望大神普及一下 我现在的思路就是 start 一直在变 跟end对比 小于就不断查询 大于就跳出 我想用高效率的 不想用笨办法 还望大神帮助
给一个简单的实例代码。

//模型
public class User
        {
            public int id { get; set; }
            public virtual string name { get; set; }
            public virtual string buyer { get; set; }
            public virtual string idArr { get; set; }
            public virtual DateTime expiredTime { get; set; }
        }

        static void Main(string[] args)
        {
            //为了快一点我就设置了3秒过期
            User u = new User() { id = 1, name = "n1", expiredTime = DateTime.Now.AddSeconds(3) };

            //方法1
            //直接时间判断
            while (true)
            {
                Thread.Sleep(1000);
                Console.WriteLine("是否过期:" + (u.expiredTime > DateTime.Now));
            }

            //方法2
            //缓存   using System.Runtime.Caching;
            MemoryCache mc = new MemoryCache("test");
            mc.Set(u.id.ToString(), u, u.expiredTime);
            while (true)
            {
                Thread.Sleep(1000);
                Console.WriteLine("是否过期:" + mc.Get(u.id.ToString()));
            }

            Console.ReadLine();
        }
[/quote] 我是不是想复杂了 while(expiredTime > DateTime.Now) { //处理事件 } 这样是不是就完了[/quote] 这个代码需要新建线程进行while循环,否者会造成UI卡死现象,因为循环不出去,UI不会刷新。
  • 打赏
  • 举报
回复
引用 24 楼 fantasykakaxi 的回复:
[quote=引用 23 楼 yangliu0512 的回复:] 为什么一定要不断的去判断?
最近在做一个cs样式的支付程序的二次开发 二维码的有效期是120s 所以要在120s内不断地判断是否成功 因为不是支付程序的一次开发 能拿到收费成功或者失败的回执 所以只能这样 [/quote] 还是反了,二维码上加上时间戳,然后验证的时候服务端时间戳加可配置的固定时间看是否有效,而不是你维护一张表做是否有效。
fantasykakaxi 2017-12-28
  • 打赏
  • 举报
回复
不过谢谢各位 我已经懂怎么做了 帮助我的人很多 我都会给分的
fantasykakaxi 2017-12-28
  • 打赏
  • 举报
回复
引用 33 楼 wanghui0380 的回复:
额,有效期内不断查询??? 那就超时呗,在net框架里最简单的超时控制就是 CancelTonkenSource cts=new CancelTokenSource(Timespan) 当然我不知道你中间怎么处理,如果是对方post给你,我们只是保存一个上下文,启动一个TaskCompletionSource,然后监控上下文是否有更改,上下文可以实现InotifyChanged,这样你无需去刷新什么,接收post的方法自己查找上下文并修改同时触发修改通知,告诉TaskCompletionSource是否完成,如果超时没有完成cts结束同时告诉TaskCompletionSource超时并cancel任务即可
老哥 你说的这是微信支付宝官方的吧 我这种是银联二次开发的 没有返回给我是否成功标志值 返回的是账单号跟时间 然后通过他给我一个函数专门查询是否交易成功 我也想用你这种 但我没辙啊
wanghui0380 2017-12-28
  • 打赏
  • 举报
回复
额,有效期内不断查询??? 那就超时呗,在net框架里最简单的超时控制就是 CancelTonkenSource cts=new CancelTokenSource(Timespan) 当然我不知道你中间怎么处理,如果是对方post给你,我们只是保存一个上下文,启动一个TaskCompletionSource,然后监控上下文是否有更改,上下文可以实现InotifyChanged,这样你无需去刷新什么,接收post的方法自己查找上下文并修改同时触发修改通知,告诉TaskCompletionSource是否完成,如果超时没有完成cts结束同时告诉TaskCompletionSource超时并cancel任务即可
fantasykakaxi 2017-12-28
  • 打赏
  • 举报
回复
引用 18 楼 xomix 的回复:
[quote=引用 楼主 fantasykakaxi 的回复:] 有效期是120s。 我用的最笨的方法。 DateTime dtStart = DateTime.Now; DateTime dtEnd = DateTime.Now.AddMinutes(2); 然后在for里面循环 函数 请问大神们 你们聪明的写法是怎么写? 用timer?
是否有效这个事情是被动事件,也就是说每次操作前验证是否有效,发现无效直接提示过期,否则继续运行。 作为服务器端,你完全不用掌握用户是否有效,用户的一张兑换券是否有效,用户的一个权限是否有效,你只要在存储这些信息的表中加上过期时间,每次这些操作前验证是否过期即可,被动去验证有效性,而不是服务端主动的记录全部用户、用户物品、用户权限的有效性,你这样做,你的服务端内存要炸的。[/quote] 大神 我明白你的意思了 你说的反了的意思 就是说 我不用120s之内 循环验证 只要在120s结束之前验证一次就可以 是这样么?
fantasykakaxi 2017-12-28
  • 打赏
  • 举报
回复
引用 25 楼 xuzuning 的回复:
加载二维码图片后,启动定时器,时间到:刷新
版主 要是你说的这样就好了 银联给我的程序 让我二次开发 流程都给我了 我肯定按照他们的做 他们没有返回支付是否成功的标志 刷新二维码也是他们给的接口关闭 就是循环验证这边 我头疼的很 我用了你说这种 判断二维码是否成功 然后循环检查 是否收费成功 逻辑流程对了 但是二维码不出来了 尴尬
fantasykakaxi 2017-12-28
  • 打赏
  • 举报
回复
引用 26 楼 xomix 的回复:
[quote=引用 24 楼 fantasykakaxi 的回复:] [quote=引用 23 楼 yangliu0512 的回复:] 为什么一定要不断的去判断?
最近在做一个cs样式的支付程序的二次开发 二维码的有效期是120s 所以要在120s内不断地判断是否成功 因为不是支付程序的一次开发 能拿到收费成功或者失败的回执 所以只能这样 [/quote] 还是反了,二维码上加上时间戳,然后验证的时候服务端时间戳加可配置的固定时间看是否有效,而不是你维护一张表做是否有效。[/quote] 求大神详细指点
FainSheeg 2017-12-27
  • 打赏
  • 举报
回复
为什么一定要不断的去判断?
fantasykakaxi 2017-12-27
  • 打赏
  • 举报
回复
引用 18 楼 xomix 的回复:
[quote=引用 楼主 fantasykakaxi 的回复:] 有效期是120s。 我用的最笨的方法。 DateTime dtStart = DateTime.Now; DateTime dtEnd = DateTime.Now.AddMinutes(2); 然后在for里面循环 函数 请问大神们 你们聪明的写法是怎么写? 用timer?
是否有效这个事情是被动事件,也就是说每次操作前验证是否有效,发现无效直接提示过期,否则继续运行。 作为服务器端,你完全不用掌握用户是否有效,用户的一张兑换券是否有效,用户的一个权限是否有效,你只要在存储这些信息的表中加上过期时间,每次这些操作前验证是否过期即可,被动去验证有效性,而不是服务端主动的记录全部用户、用户物品、用户权限的有效性,你这样做,你的服务端内存要炸的。[/quote] 我这个有效期 是那种短暂的几分钟 而且要不断地使用有效期内判断 所以存入数据库的一般是时间节点 我这边是时间段 就是两分钟
fantasykakaxi 2017-12-27
  • 打赏
  • 举报
回复
引用 16 楼 hanjun0612 的回复:
[quote=引用 15 楼 fantasykakaxi 的回复:] [quote=引用 14 楼 loyal_to 的回复:] 加个字段记之前的时间,再用当前时间减去不就完了
对啊对啊 想复杂了 一开始想到循环时间 就像for跟foreach 结果用个while 就可以了[/quote] 不用while。我上面的代码用while只是演示一下过期判断。 你直接在使用时判断一下就好了。不需要while[/quote] 直接if判断么? 那只会判断一次啊 我是想循环判断 知道时间过期 跳出
yangniao 2017-12-27
  • 打赏
  • 举报
回复
最好是做下存储,这样有个记录,到时候有问题也容易查看是哪里出的问题,
正怒月神 2017-12-27
  • 打赏
  • 举报
回复
引用 17 楼 xomix 的回复:
[quote=引用 1 楼 hanjun0612 的回复:] 你这个含义不明确。 如果像奖券的有效期,那么存储数据库,然后跑个服务用来修改状态就好了。 如果是类似cache之类的过期,可以设定过期时间。 我看你2分钟就过期,那么可以考虑缓存起来设置一个过期时间就可以了。
你都存储数据库了,在存入的时候写过期时间不就好了,判断过期时间和当前时间的差就可以确认是否过期了,这样用户强制要求延期的时候你还有接口可以延期。 [/quote] 只能说每个人思考方向不一样。 我们这边普遍来说,都是通过数据状态来判断数据可用性。 特别在于别人调用接口时,别人更加希望使用状态来了解数据的可用性,而不是通过进一步比对的方式。 而且我也并不纠结这些细节上处理数据的问题。
  • 打赏
  • 举报
回复
引用 楼主 fantasykakaxi 的回复:
有效期是120s。 我用的最笨的方法。 DateTime dtStart = DateTime.Now; DateTime dtEnd = DateTime.Now.AddMinutes(2); 然后在for里面循环 函数 请问大神们 你们聪明的写法是怎么写? 用timer?
是否有效这个事情是被动事件,也就是说每次操作前验证是否有效,发现无效直接提示过期,否则继续运行。 作为服务器端,你完全不用掌握用户是否有效,用户的一张兑换券是否有效,用户的一个权限是否有效,你只要在存储这些信息的表中加上过期时间,每次这些操作前验证是否过期即可,被动去验证有效性,而不是服务端主动的记录全部用户、用户物品、用户权限的有效性,你这样做,你的服务端内存要炸的。
  • 打赏
  • 举报
回复
引用 1 楼 hanjun0612 的回复:
你这个含义不明确。 如果像奖券的有效期,那么存储数据库,然后跑个服务用来修改状态就好了。 如果是类似cache之类的过期,可以设定过期时间。 我看你2分钟就过期,那么可以考虑缓存起来设置一个过期时间就可以了。
你都存储数据库了,在存入的时候写过期时间不就好了,判断过期时间和当前时间的差就可以确认是否过期了,这样用户强制要求延期的时候你还有接口可以延期。
正怒月神 2017-12-27
  • 打赏
  • 举报
回复
引用 15 楼 fantasykakaxi 的回复:
[quote=引用 14 楼 loyal_to 的回复:] 加个字段记之前的时间,再用当前时间减去不就完了
对啊对啊 想复杂了 一开始想到循环时间 就像for跟foreach 结果用个while 就可以了[/quote] 不用while。我上面的代码用while只是演示一下过期判断。 你直接在使用时判断一下就好了。不需要while
xuzuning 2017-12-27
  • 打赏
  • 举报
回复
加载二维码图片后,启动定时器,时间到:刷新
fantasykakaxi 2017-12-27
  • 打赏
  • 举报
回复
引用 23 楼 yangliu0512 的回复:
为什么一定要不断的去判断?
最近在做一个cs样式的支付程序的二次开发 二维码的有效期是120s 所以要在120s内不断地判断是否成功 因为不是支付程序的一次开发 能拿到收费成功或者失败的回执 所以只能这样
加载更多回复(15)

111,093

社区成员

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

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

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