【问题标题】:Solution to a timed out/End Date event超时/结束日期事件的解决方案
【发布时间】:2012-08-12 12:32:30
【问题描述】:

希望有人可以帮助我找到正确的方向来解决我在系统设计过程中遇到的这个问题。

我正在创建一个拍卖网站,其中拍卖具有特定的结束日期/时间。

我有一个 .NET 计时器向用户显示剩余时间,当倒计时时它会触发并更新后端 SQL 数据库以说明拍卖已完成,它会通知获胜用户并触发 CLOSE 函数。

对于当时未在浏览器中实际打开的拍卖,您如何建议这样做,这样 Timer 事件就不会创建此 CLOSE 事件。

理想情况下,我需要在拍卖结束时间过去的时间点运行一些东西?

谢谢

【问题讨论】:

  • 你最后在这里做什么?答案有帮助吗?
  • 我不得不采用稍微不同的方法,因为该站点目前处于共享托管解决方案上,因此我无法运行服务,因此我正在使用此解决方案...@987654321 @ 但在 DoWork 部分,我检查了 auctionEnddate 是否为

标签: c# asp.net .net sql-server vb.net


【解决方案1】:

一种选择是将拍卖项目结束/结束的日期/时间存储在数据库中。然后,不要担心对它的关闭有反应(在您的情况下是客户端上的计时器)并更新它关闭。决定它关闭的原因仅仅是现在 > 关闭日期/时间。

编辑:

在下面的评论中,您说您还需要在拍卖结束时发送邮件。如果是这种情况,您需要某种后台处理来选择所有关闭的事件并发送邮件。您仍然可以通过存储日期时间来定义关闭。该 bg 处理可以选择所有现在大于关闭日期且已处理位为假的事件。选择这些后,将它们放入持久队列(sql 中的表、azure 队列等......)。然后让后台处理排空队列。在处理每个项目并发送邮件时,它会将事件更新为已处理。

您有多种后台处理选项:

  1. Windows 服务
  2. 在带有要处理的线程池的 proc 计时器中(仅当您有一个 AT 时才这样做)
  3. Azure 中的辅助角色
  4. Sql 代理作业

【讨论】:

  • +1 不像我的回答需要服务,这个解决方案完全不需要更新任何标志,而是使用业务逻辑来指示拍卖过期。
  • 嗨@bryanmac,我将拍卖结束的日期/时间存储在我的数据库中,页面上的计时器当前使用它。但是,如果用户没有打开页面,那么关闭事件将永远不会触发,所以下面关于 Windows 服务在拍卖结束时有效侦听的答案可能是最佳答案?
  • 这增加了一堆你不需要的复杂性、移动部件和延迟。相反,干脆不更新关闭。存储事件与该事件一起关闭的日期,以及是否关闭的定义是当前是否超过该日期。
  • 例如,当浏览器从服务器读取事件时,如果 now > 检索到关闭的数据,页面将显示关闭。您还可以让服务器拒绝出价等...如果现在 > 事件的截止日期。
  • 解决方案的另一个变体(如果您需要关闭位)是根据关闭日期创建一个计算列。重点是避免需要“观看”每个事件来更新。
【解决方案2】:

编写一个 Windows 服务,在设定的时间内轮询数据库(我会说比拍卖的最短时间短一点。例如,说一天)。该服务将在内存中存储将在该时间内结束的动作,并每秒检查是否有结束的动作。对于已结束的拍卖,触发您的 CLOSE 事件。

【讨论】:

  • 我认为这可能是看待它的最佳方式,但我需要研究 Windows 服务的工作原理。我实际上想通过电子邮件发送中标者并在拍卖“结束”时关闭拍卖,这样我就可以在 Windows 服务检查这些时间时运行它!
  • 在您的问题中,您没有说需要在关闭时发送电子邮件。如果您需要这样做,那么您需要一些后台工作人员(如 Windows 服务或 bg 线程)来检查已结束的拍卖。此时,您可以结合使用这两种方法。
  • +1,因为可能需要两者的混合(最初没有说需要发送邮件)。
  • 其实不是每秒触发一次,而是在服务启动时,你可以找出第一次拍卖结束的时间,然后他们等到那个时间。除非您能够允许用户在拍卖结束时进行更改(我认为不会)。
猜你喜欢
  • 2011-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-25
  • 2020-11-10
  • 2011-08-09
  • 2019-06-12
相关资源
最近更新 更多