大佬教程收集整理的这篇文章主要介绍了c# – 任务MaxDegreeOfParallelism可以每次从我的列表中获取前n个对象吗?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
List<string> _files = new List<string>(); public void Start() { CancellationTokenSource _tokenSource = new CancellationTokenSource(); var token = _tokenSource.Token; Task.Factory.StartNew(() => { try { Parallel.ForEach(_files,new ParallelOptions { MaxDegreeOfParallelism = 5 //limit number of parallel threads },file => { if (token.IsCancellationRequested) return; //do work... }); } catch (Exception) { } },_tokenSource.Token).ContinueWith( t => { //finish... },TaskScheduler.FromCurrentSynchronizationContext() //to ContinueWith (update UI) from UI thread ); }
List<string> files = List<string> { "a","b","c","d","e","f","g","h","i" };
当它分区时,它可以像这样均匀地分割它(如果Max是3个线程):
> Thread1的工作清单:“a”,“b”,“c”
> Thread2的工作清单:“d”,“e”,“f”
> Thread3的工作清单:“g”,“h”,“i”
因此,如果你看过正在处理的文件,它可能看起来像
"a","i"
如果你创建一个自定义分区程序,你可以让它一次只取一个项目,而不是一次批处理,使工作列表看起来像
> Thread1的工作清单:“a”,GetTheNextUnprocessedString()
> Thread2的工作清单:“b”,GetTheNextUnprocessedString()
> Thread3的工作清单:“c”,GetTheNextUnprocessedString()
如果您使用的是.NET 4.5,则可以像这样使用this factory:
Parallel.ForEach(Partitioner.Create(_files,EnumerablePartitionerOptions.NoBuffering),(file,loopstate,index) => { if (token.IsCancellationRequested) return; //do work... });
如果您不使用.NET 4.5,这不是一项微不足道的任务,所以我不打算在这里为您编写.阅读我在顶部链接的MSDN文章,您最终可以找到它.
我会做的是问自己“我真的需要按顺序处理文件吗?”如果您不需要它们按顺序让它自己进行排序,因为您通过执行订单可能会做的唯一事情可能会减慢流程.
以上是大佬教程为你收集整理的c# – 任务MaxDegreeOfParallelism可以每次从我的列表中获取前n个对象吗?全部内容,希望文章能够帮你解决c# – 任务MaxDegreeOfParallelism可以每次从我的列表中获取前n个对象吗?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。