C#任务线程池 – 仅跨10个线程运行100个任务
参见英文答案 >
Have a set of Tasks with only X running at a time????????????????????????????????????5个
我只是想知道是否有人可以指出我关于async / await框架和线程池的正确方向? 基本上,我正在尝试做的是在单独的线程/异步中执行x个操作,但是最多y个线程. 例如,假设我有100个数据库操作: 我想要做的是有一些方法一次运行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) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |