我当前的解决方案使用ThreadPool处理事务。每隔几分钟我就抓住1-200个事务并通过QueueUserWorkItem函数对每个事务进行排队。像这样的“trans”是我的交易集合:
For Each t As ManagerTransaction In trans
Threading.ThreadPool.QueueUserWorkItem(AddressOf ProcessManagerTransaction, t)
Next
我想将其切换为使用TPL,但经过大量研究后,我仍然不确定最佳方法。我有以下选择,但我还未能就最佳实践找到一致意见。
1) Threading.Tasks.Parallel.ForEach(trans, AddressOf ProcessManagerTransaction)
“t”是我的“trans”集合中的个别交易
2) Task.Factory.StartNew(AddressOf ProcessManagerTransaction, t)
2a) Task.Factory.StartNew(Sub() ProcessManagerTransaction(t)
这两者的结合:
3) Task.Factory.StartNew(Function() Parallel.ForEach(trans, AddressOf ProcessManagerTransaction))
答案 0 :(得分:1)
第一个选项通常是可以实现的,因为它可以完成您想要的一切:并行化和传播错误。选项2和3需要额外的方法来传播错误。
如果您要求拥有任务,则选项2可能会起作用,因此您可以将其与其他任务组合在一起。
我真的没有看到我会使用选项3的情况。