【发布时间】:2020-08-19 12:09:03
【问题描述】:
场景
- 服务器必须处理一组报告,每个报告包含 n 个员工
- UI 接受大量输入并触发处理报告的调用
- 服务器上的进程调用使用
HostingEnvironment.QueueBackgroundWorkItem排队到后台线程 - 在此后台线程中运行的函数使用
Parallel.ForEach并行化报表处理逻辑 - UI 基本上显示了一个包含报告列表的简单网格,每个报告都有一个 status,它通过 SignalR 从服务器接收更新
这里的挑战是我们需要能够从 UI 中取消每个报告。但报告处理逻辑在Parallel.ForEach 内。我确实看到了有关CancellationToken 的文档,但这会破坏整个循环。我正在寻找一种与Parallel.ForEach 中运行的每个任务进行通信的方法,并指示当取消请求来自 UI 时是否必须取消它。
这可能吗?或者是否有其他方法?
【问题讨论】:
-
当然,如果您在字典等对象中注册报告,并且在处理过程中,您的处理器将在该字典中检查一个令牌以停止处理...然后,当您发送取消命令时,您会检查它某些作业,如果存在,每个报告的某些键,然后设置取消标志.....或者,您可以创建具有多个消费者的生产者-消费者设置,每个消费者都使用
Task.Run开始,然后单独使用令牌。 -
为什么你认为使用
CancellationToken会“打破整个循环”? -
@Enigmativity 我看到如果我们有一个 CancellationToken 被发送到这个循环中,并抛出一个异常,它将打破循环,不是吗?
-
@user11944367 -
CancellationToken不必抛出。您只需检查.IsCancellationRequested属性,看看是否需要取消操作。
标签: c# asp.net-mvc multithreading task-parallel-library