加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C#任务线程池 – 仅跨10个线程运行100个任务

发布时间:2020-12-15 19:47:35 所属栏目:百科 来源:网络整理
导读:参见英文答案 Have a set of Tasks with only X running at a time????????????????????????????????????5个 我只是想知道是否有人可以指出我关于async / await框架和线程池的正确方向? 基本上,我正在尝试做的是在单独的线程/异步中执行x个操作,但是最多y个
参见英文答案 > Have a set of Tasks with only X running at a time????????????????????????????????????5个
我只是想知道是否有人可以指出我关于async / await框架和线程池的正确方向?

基本上,我正在尝试做的是在单独的线程/异步中执行x个操作,但是最多y个线程.

例如,假设我有100个数据库操作:
await _repository.WriteData(someData);

我想要做的是有一些方法一次运行10个这样的操作(理想情况是每个单独的线程,所以10个线程),并且每个完成后,下一个在线程上启动变得可用了.然后我们等待所有操作完成并完成所有线程……

这是否可以轻松实现而无需太多努力或增加大量复杂性?

解决方法

我认为你通过专注于线程来忽略这一点,特别是对于不需要线程执行的异步操作.

.NET有一个很棒的ThreadPool你可以使用.你不知道它中有多少个线程,你不在乎.它只是工作(直到它没有,你需要自己配置它,但这是非常先进的).

在ThreadPool上运行任务非常简单.为每个操作创建任务并使用SemaphoreSlim限制它们或使用现成的TPL Dataflow块.例如:

var block = new ActionBlock<SomeData>(
    _ => _repository.WriteDataAsync(_),// What to do on each item
    new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = 10 }); // How many items at the same time

foreach (var item in items)
{
    block.Post(item); // Post all items to the block
}

block.Complete(); // Signal completion
await block.Completion; // Asynchronously wait for completion.

但是,如果您计划创建“专用”线程,则可以将Task.Factory.StartNew与LongRunning选项一起使用,该选项在ThreadPool外部创建专用线程.但请记住,异步操作在整个操作过程中不会保持相同的线程,因为异步操作不需要线程.因此,从专用线程开始可能毫无意义(更多关于我的博客:LongRunning Is Useless For Task.Run With async-await)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读