如何将工作排队等待请求,并且仅对同一请求执行一次工作

罗密索尔

我正在开发一个API,其中我的端点接受ID,然后执行繁重的操作来合成结果(生成PDF)。

我可能会在很短的时间内多次收到相同资源的相同请求,所以我想要某种跟踪ID的工作队列,第一个请求将启动实际的工作,随后的请求将(首先检查它是否已经在管道中,然后)只需等到工作完成并返回相同的结果即可。

首先,我认为aConcurrentDictionary可能会有用,但是我不知道如何处理直到完成工作为止的等待我也查看了ObservableCollection,但是我不确定它的安全性(没有花费过多的精力来手动使其安全)。

马蒂亚斯247

我可能会使用一个普通的字典,该字典的周围和Task内部都带有锁,当计算出工作项的结果时,这些字典就完成了。

这意味着将工作的每个部分都表示为Task<WorkResult>

如果收到新请求,您可以执行以下操作:

lock (currentWork)
{
  Task<WorkResult> workItem = null;
  if (currentWork.TryGetResult(workId, out workItem))
  {
    // Work is already in progress. Reuse that work item
    return workItem; // The caller can await that
  }

  // Create a new workItem
  workItem = FunctionThatStartsWork(); // Could also be a Task.Run(...) thing
  // Store it in the map
  currentWork[workId] = workItem;

  // Return it to the caller so that he can await it
  return workItem;
}

现在还有一个问题是谁从字典中删除该项目。一种方法可能是继续创建工作任务,一旦完成,该任务就会从地图中删除。

workItem.ContinueWith(wi => {
  lock (currentWork) {
    currentWork.Remove(workId);
  }
});

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

是否可以仅对一次请求请求触发一个Github工作流程?

来自分类Dev

如何将URLSession.DataTaskPublisher请求排队,以便一次只创建一个?

来自分类Dev

Ajax请求仅工作一次

来自分类Dev

ajax请求在laravel中仅工作一次

来自分类Dev

AJAX请求将仅工作一次的popover填充到php文件

来自分类Dev

如何一次执行一项工作,但每个小时都执行一次?

来自分类Dev

排队WCF请求的最佳方法,以便一次只处理一个

来自分类Dev

python龙卷风AsyncHTTPClient提取请求在线程中工作一次

来自分类Dev

微信 SendAuth 请求访问令牌代码只能工作一次

来自分类Dev

iOS Parse(减少API请求)每周同一天每周执行一次功能

来自分类Dev

如何将异常标记为已记录(并且仅记录一次)?

来自分类Dev

我如何安排将来要执行的工作,但是只有一次

来自分类Dev

如何在.net core 3.0中执行一次工作者服务?

来自分类Dev

服务方法如何在ngOnInit()甚至ngOnInit()挂钩执行一次的内部工作?

来自分类Dev

如何使Cron在工作时间内每小时执行一次任务?

来自分类Dev

如何使用工作箱排队发布请求?

来自分类Dev

我是否必须使用GitHub对所有提交执行一次请求请求

来自分类Dev

来自Ionic应用程序的Https请求第一次返回403,然后开始工作

来自分类Dev

如何使用@ NgRx / effects仅将请求发送到服务器一次

来自分类Dev

如何单击一次并导航到请求页面?

来自分类Dev

如何单击一次并导航到请求页面?

来自分类Dev

如何确保代码块仅执行一次,并且仅执行一次。再也没有

来自分类Dev

S3如何将所有请求路由到同一资源?

来自分类Dev

如何将Ajax请求发送到同一服务器的不同URL

来自分类Dev

如何将Ajax请求发送到同一服务器的不同URL

来自分类Dev

S3如何将所有请求路由到同一资源?

来自分类Dev

如何将多个不同的请求主体映射到同一个 POJO

来自分类Dev

如何从批处理文件中仅对服务器执行一次ping操作?

来自分类Dev

如何将IEnumerable <SelectListItem>集合传递给MVC局部视图,每个请求仅进行一次数据库查找

Related 相关文章

  1. 1

    是否可以仅对一次请求请求触发一个Github工作流程?

  2. 2

    如何将URLSession.DataTaskPublisher请求排队,以便一次只创建一个?

  3. 3

    Ajax请求仅工作一次

  4. 4

    ajax请求在laravel中仅工作一次

  5. 5

    AJAX请求将仅工作一次的popover填充到php文件

  6. 6

    如何一次执行一项工作,但每个小时都执行一次?

  7. 7

    排队WCF请求的最佳方法,以便一次只处理一个

  8. 8

    python龙卷风AsyncHTTPClient提取请求在线程中工作一次

  9. 9

    微信 SendAuth 请求访问令牌代码只能工作一次

  10. 10

    iOS Parse(减少API请求)每周同一天每周执行一次功能

  11. 11

    如何将异常标记为已记录(并且仅记录一次)?

  12. 12

    我如何安排将来要执行的工作,但是只有一次

  13. 13

    如何在.net core 3.0中执行一次工作者服务?

  14. 14

    服务方法如何在ngOnInit()甚至ngOnInit()挂钩执行一次的内部工作?

  15. 15

    如何使Cron在工作时间内每小时执行一次任务?

  16. 16

    如何使用工作箱排队发布请求?

  17. 17

    我是否必须使用GitHub对所有提交执行一次请求请求

  18. 18

    来自Ionic应用程序的Https请求第一次返回403,然后开始工作

  19. 19

    如何使用@ NgRx / effects仅将请求发送到服务器一次

  20. 20

    如何单击一次并导航到请求页面?

  21. 21

    如何单击一次并导航到请求页面?

  22. 22

    如何确保代码块仅执行一次,并且仅执行一次。再也没有

  23. 23

    S3如何将所有请求路由到同一资源?

  24. 24

    如何将Ajax请求发送到同一服务器的不同URL

  25. 25

    如何将Ajax请求发送到同一服务器的不同URL

  26. 26

    S3如何将所有请求路由到同一资源?

  27. 27

    如何将多个不同的请求主体映射到同一个 POJO

  28. 28

    如何从批处理文件中仅对服务器执行一次ping操作?

  29. 29

    如何将IEnumerable <SelectListItem>集合传递给MVC局部视图,每个请求仅进行一次数据库查找

热门标签

归档