【问题标题】:Perform an operation on same thread within a Parallel Execution [closed]在并行执行中对同一线程执行操作[关闭]
【发布时间】:2014-07-29 23:22:28
【问题描述】:

我有一个需求,我需要在并行执行流程中进行一些同步处理。

我有一些在 Parallel foreach 中工作的任务。现在我需要做的是,在这之间做一些数据库更新。 我不想使用 async 和 await 来完成,因为这会调用多个线程并加载我的服务器。

由于这些数据库更新对我很重要,但我不希望它们阻塞我的主要执行流程。 我想要实现的是数据库更新应该始终在同一个线程上同步完成,这样可以加快主流程。

在我使用任务时这可能吗?如果是这样,任何人都可以提出相同的建议。

【问题讨论】:

  • 如果您希望它们同步完成,只需同步运行它们。有什么问题?
  • 你能发布一些示例代码吗?目前尚不清楚您要做什么以及问题是什么。
  • async/await 并不意味着多线程。您可以轻松地在 ActionBlock<T> 中使用异步数据库访问(请参阅 dcastro 的回答),并且一次只会保存一次(异步)。
  • 卢安:谢谢你的回复。基本上问题是,每次并行执行都会调用它,它会生成新线程。这是我想要避免的。

标签: c# multithreading task-parallel-library


【解决方案1】:

如果我理解正确,你有几个并发任务想要保存一些东西来做数据库 - 但是数据库访问必须是单线程的,而不是并发的,对吗?

您也不希望在将数据保存到数据库时阻塞并发任务。

如果是这样,请使用 TPL 数据流ActionBlock

var actionBlock = new ActionBlock<int>(n => SaveIntToDatabase(n));

然后让你的并发任务将内容发布到块中:

actionBlock.Post(2);       //blocking
actionBlock.SendAsync(2);  //non-blocking

【讨论】:

  • 您好,感谢您的回复。其实是不一样的。我也将在多个线程中更新数据库。但关键是,我需要为“健康监控”执行一个单独的过程,在该过程中我需要更新数据库中的值,这不应妨碍/影响代码的主要流程。希望现在清楚吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-22
  • 2021-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多