c# - Asp.Net 中有没有办法与运行 Parallel.Foreach 的后台线程进行通信
问题描述
设想
- 服务器必须处理一组报告,每个报告包含n个员工
- UI 接收大量输入并触发处理报告的调用
- 服务器上的进程调用排队到后台线程使用
HostingEnvironment.QueueBackgroundWorkItem
- 在此后台线程中运行的函数
Parallel.ForEach
用于并行化报表处理逻辑 - UI 基本上显示了一个包含报告列表的简单网格,每个报告都有一个状态,该状态正在通过 SignalR 从服务器接收更新
这里的挑战是我们需要能够从 UI 中取消每个报告。但报告处理逻辑在Parallel.ForEach
. 我确实看到了有关 的文档CancellationToken
,但这会破坏整个循环。我正在寻找的是一种与其中运行的每个任务进行通信Parallel.ForEach
并指示当取消请求来自 UI 时是否必须取消它的方法。
这甚至可能吗?或者是否有其他方法?
解决方案
查看有关在并行循环中处理异常的文档。实际上,您可以构建它,以便可以在循环迭代中捕获抛出的异常,并且您可以控制何时捕获哪些异常。
然后,构建一个数据结构,其中包含一个任务、一个 CancellationTokenSource 以及一些识别它所绑定到的报表的方法。使用它自己的 CancellationTokenSource 设置该结构中的每个任务,基于该源为任务设置取消令牌,并设置您的后台工作人员以迭代该结构的集合并从那里启动任务。然后如果需要取消,可以通过ID访问集合中的包含结构,使用该CancellationTokenSource.Cancel()
方法将token源翻转为取消,任务将停止并抛出一个OperationCanceledException,可以在循环迭代中捕获并忽略。
推荐阅读
- mongoose - Mongoose 聚合和总和
- windows - Windows 如何在后台处理进程创建
- r - ROCR 包中的性能函数错误消息
- reactjs - 如果我正在解构我的道具,我如何调用 props.history.push() ?
- typescript - 在打字稿功能中似乎没有充分考虑泛型
- python - Pandas - 如何按一个数字列分组并按每组的中位数过滤每组中的行?
- html - 如何在引导程序 4 下拉菜单上禁用悬停
- java - Collectors.Counting 的时间复杂度 (java)
- ios - Firebase observeSingleEvent 完成处理程序
- c - 了解父子进程执行顺序