【问题标题】:Threadpool to Task Conversion线程池到任务的转换
【发布时间】:2012-12-28 20:20:54
【问题描述】:

我当前的解决方案使用 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))

【问题讨论】:

  • 没有达成共识,因为所有选项都可能有用,具体取决于您到底想要什么。

标签: vb.net multithreading task-parallel-library threadpool .net-4.5


【解决方案1】:

第一个选项通常是可取的,因为它可以满足您的所有需求:并行化和错误传播。选项 2 和 3 需要额外的方法来传播错误。

如果您需要有任务,那么选项 2 可能会发挥作用,以便您可以将它们与其他任务组合起来。

我真的没有看到我会使用选项 3 的情况。

【讨论】:

  • 如果您想并行化并且不阻塞当前线程(例如,当它是一个 GUI 线程时),选项 3 会很有用。
猜你喜欢
  • 1970-01-01
  • 2014-12-05
  • 2010-09-07
  • 2010-12-18
  • 2012-09-03
  • 1970-01-01
  • 2015-07-13
  • 1970-01-01
  • 2012-02-12
相关资源
最近更新 更多