public static void SendMail(MoveRecInfo info) { // 为了演示简单,这里就不发邮件了,直接写文件。 string mailBody = info.Reason + "\r\n操作时间:" + DateTime.Now.ToString() + "\r\n\r\n\r\n"; // 为了便于验证这个方法的调用次数,写文件时,并不覆盖,而是追加内容。 string filePath = Path.Combine(WebSiteApp.AppDataPath, info.RowGuid + ".txt"); File.AppendAllText(filePath, mailBody, System.Text.Encoding.UTF8); }
private void MoveRecInfoRemovedCallback(string key, object value, CacheItemRemovedReason reason) { if (reason == CacheItemRemovedReason.Removed) { return; // 忽略后续调用HttpRuntime.Cache.Insert()所触发的操作 } // 能运行到这里,就表示是肯定是缓存过期了。 // 换句话说就是:用户2分钟再也没操作过了。 // 从参数value取回操作信息 MoveRecInfo info = (MoveRecInfo)value; // 这里可以对info做其它的处理。 // 最后发一次邮件。整个延迟发邮件的过程就处理完了。 MailSender.SendMail(info); }
public int MoveRec(MoveRecInfo info) { // 这里就不验证从客户端传入的参数了。实际开发中这个是必须的。 // 先来调整记录的顺序,示例程序没有数据库,就用Cache来代替。 int sequence = 0; int.TryParse(HttpRuntime.Cache[info.RowGuid] as string, out sequence); // 简单地示例一下调整顺序。 sequence += info.Direction; HttpRuntime.Cache[info.RowGuid] = sequence.ToString(); string key = info.RowGuid + "_DelaySendMail"; // 这里我不直接发邮件,而是把这个信息放入Cache中,并设置2秒的滑过过期时间,并指定移除通知委托 // 将操作信息放在缓存,并且以覆盖形式放入,这样便可以实现保存最后状态。 // 注意:这里我用Insert方法。 HttpRuntime.Cache.Insert(key, info, null, Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(2.0), CacheItemPriority.NotRemovable, MoveRecInfoRemovedCallback); return(sequence); }