【问题标题】:Delay a block of code [closed]延迟一段代码[关闭]
【发布时间】:2017-02-23 15:25:48
【问题描述】:

在我的 WebApi 项目中,我有一个应该延迟一小段代码的端点。 我们举个例子:

我需要实现一种机制,允许客户预订资源。预订时间应该只有 120 秒的持续时间,然后到期。 在代码方面,我有这样的东西:

//booking
foreach (var item in list) {
    item.Status = ItemStatus.Booked;
}
await _context.SaveChangesAsync();

//Setup a delayed "thread" which removes the booking
Task.Delay( TimeSpan.FromMinutes( 2 ) )
    .ContinueWith( x => {
        //loop on the list and set the status to "ReadyForSale"
        //if this is still in the Booking
    } );

return;

我想了解这样的解决方案是否满足我的要求。当前线程不应该被延迟任务阻塞,我需要找到一种方法将项目列表传递给延迟任务。

【问题讨论】:

  • 试试看吧。 告诉我们这是否适合你。如果它不起作用,请解释它如何无法完成您希望它做的事情。
  • 你是对的,这主要是一个验证请求。我实际上缺少的是它在幕后是如何工作的。延迟的任务在哪里?这种工作方式在 webapi 中有什么缺点吗?和这样的事情
  • 如果应用程序池回收(在许多可能的事件中)此代码将无法运行,这对您来说重要吗?如果是这样,您可能需要考虑另一种策略(例如,记录 BookedDate 而不是纯粹的 Booked 状态,然后在 BookedDate 过去超过 2 分钟时允许新预订(这有问题方法也是如此,尤其是当您希望扩展到多台服务器时,但可以处理它们))
  • @Servy:我也可以这么说:但你没有做出任何贡献。我真的不理解那些花时间批评、投反对票或类似事情而不是花时间提供帮助的人。无论如何,感谢您的发现。
  • 是的,但在作者说出我在第一条评论中所写的内容后,我不再继续争论。请,如果您不想就这个问题提供帮助,请让其他人去做。

标签: c# asp.net-web-api concurrency task


【解决方案1】:

我认为任务永远不会运行的风险。如果服务器崩溃或 IIS 决定它需要回收池怎么办。
存在状态永远无法恢复的风险。

我可能会在数据库中设置一个bokedAt DateTime 字段,然后检查与现在相比的时间是否超过两分钟,以确定该项目是否已预订。甚至可能是一个计算列来检查这个并返回状态。

【讨论】:

  • 感谢您的回答。但是,在实施您的解决方案的情况下,我的延续代码应该改变,对吧?我的意思是,与其尝试从特定项目中删除预订,不如删除所有已过期的预订。此外,我不需要为每个预订设置延迟任务,但也许我只需要一个更通用的任务,它会定期运行以删除所有过期的预订。对吗?
  • 不,你根本不需要任何任务。当您查询表时,如果 bokedAt - Now > 2 分钟,则该项目再次为 ReadyForSale。不需要清除任何东西。当再次 boked 时,只需用新值覆盖 bokedAt 日期时间。
猜你喜欢
  • 1970-01-01
  • 2022-07-29
  • 2014-05-08
  • 2013-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-03
相关资源
最近更新 更多