Tag: parallel.foreach

为什么Parallel.ForEach改变了它的线程文化?

今天我遇到了一个我无法解释的奇怪现象。 在gridview中有一个包含多个行的网页,需要将其逐个保存到数据库和XML文件中。 我最终使用了Parallel.ForEach ,因为行之间没有关系,所以它们可以独立执行。 代码基本上是这样的: Parallel.ForEach(gvWithData.Rows.Cast(), row => { if (row.RowType == DataControlRowType.DataRow) { // do some logic and stuff… var type = new Object { … }; // save to the database type.Save(); // retrieve the saved item from the database again // since we need some autoincrement values from the db var typeAfterSave […]

MaxDegreeOfParallelism = Environment.ProcessorCount减慢了CPU的执行时间

我有以下程序(我从http://blogs.msdn.com/b/csharpfaq/archive/2010/06/01/parallel-programming-in-net-framework-4-getting-started.aspx获得 )使用Parallel.For循环拆分任务 class Program { static void Main(string[] args) { var watch = Stopwatch.StartNew(); Parallel.For(2, 20, (i) => { var result = SumRootN(i); Console.WriteLine(“root {0} : {1} “, i, result); }); Console.WriteLine(watch.ElapsedMilliseconds); Console.ReadLine(); } public static double SumRootN(int root) { double result = 0; for (int i = 1; i < 10000000; i++) { result […]

C#Parallel.Foreach相当于Python

我有96个txt文件需要处理。 现在我正在使用for循环并一次执行一个,这个过程非常慢。 生成的96个文件,不需要合并。 有没有办法使它们并行运行,ala Parallel.foreach在C#中? 当前代码: for src_name in glob.glob(source_dir+’/*.txt’): outfile = open (…) with open(…) as infile: for line in infile: –PROCESS– for –condition–: outfile.write(…) infile.close() outfile.close() 希望此进程并行运行source_dir中的所有文件。

Task.StartNew()vs Parallel.ForEach:多个Web请求场景

我已经阅读了SO中的所有相关问题,但对于我的场景中触发多个Web服务调用的最佳方法有点困惑。 我有一个聚合器服务,它接受输入,解析并将其转换为多个Web请求,进行Web请求调用(不相关,因此可以并行触发)并合并发送回调用者的响应。 现在使用以下代码 – list.ForEach((object obj) => { tasks.Add(Task.Factory.StartNew((object state) => { this.ProcessRequest(obj); }, obj, CancellationToken.None, TaskCreationOptions.AttachedToParent, TaskScheduler.Default)); }); await Task.WhenAll(tasks); await Task.WhenAll(tasks)来自Scott Hanselman的post ,据说 斯蒂芬说:“从可扩展性的角度来看,更好的解决方案是利用异步I / O.当你通过网络呼叫时,没有理由(除了方便之外)在等待响应来阻止线程时背部” 现有代码似乎消耗了太multithreading,并且处理器时间在生产负载上达到100%,这让我思考。 另一个替代是使用Parallel.ForEach,它使用分区器,但也“阻塞”调用,这对我的场景来说很好。 考虑到这是所有“异步IO”工作而不是“CPU绑定”工作,并且Web请求不会长时间运行(最多返回3秒),我倾向于认为现有代码足够好。 但这会提供比Parallel.ForEach更好的吞吐量吗? Parallel.ForEach可能使用“最小”数量的任务,因为分区因此最佳使用线程(?)。 我用一些本地测试测试了Parallel.ForEach,但似乎没有更好。 目标是减少CPU时间并提高吞吐量,从而提高可扩展性。 是否有更好的方法来并行处理Web请求? 感谢任何投入。 编辑:代码示例中显示的ProcessRequest方法确实使用HttpClient及其异步方法来触发请求(PostAsync,GetAsync,PutAsync)。

并行地以顺序方式执行N个线程

我有一个应用程序,我有1个大文件的1000多个小部分。 我必须一次上传最多16个零件。 我使用.Net的Thread并行库。 我使用Parallel.For来划分多个部分并分配1个应该为每个部分执行的方法,并将DegreeOfParallelism设置为16。 我需要使用由不同部分上传生成的校验和值执行1方法,因此我必须设置某些机制,我必须等待所有部件上传说1000完成。 在TPL库中,我面临的问题是它是从1000中随机执行16个线程中的任何一个。 我想要一些机制,我可以在最初运行前16个线程,如果第一个或第二个或任何16个线程完成其任务,则应该启动第17个部分。 我怎样才能做到这一点?

并行请求刮取网站的多个页面

我想用一个包含大量有趣数据页面的网站,但由于源非常大,我想multithreading并限制过载。 我使用Parallel.ForEach来启动10个任务的每个块,然后在main for循环中等待,直到活动线程的数量开始下降到阈值以下。 为此我使用活动线程的计数器,我在使用WebClient启动新线程时递增,并在触发WebClient的DownloadStringCompleted事件时递减。 最初的问题是如何使用DownloadStringTaskAsync而不是DownloadString并等待Parallel.ForEach启动的每个线程都已完成。 这已通过一种解决方法解决:主要foor循环中的计数器( activeThreads )和Thread.Sleep 。 使用await DownloadStringTaskAsync而不是DownloadString应该通过在等待DownloadString数据到达时释放线程来提高速度吗? 回到原来的问题,是否有办法更优雅地使用TPL,而没有涉及计数器的解决方法? private static volatile int activeThreads = 0; public static void RecordData() { var nbThreads = 10; var source = db.ListOfUrls; // Thousands urls var iterations = source.Length / groupSize; for (int i = 0; i RecordUri(item)); //I want to wait here until process […]

如何通过parallel.foreach了解每个线程产生的threadid

我有一个像这样的场景 int arr[100]; Parallel.Foreach(arr, (a) => { some processing}); 现在,这段代码将生成100个子线程,如何在“某些处理”逻辑中知道每个子线程的线程id。

Howto:Parallel.Foreach在每个进程运行一个新进程(但一次只有一个进程)后执行许多进程?

我相信有人知道这一点,我会非常感谢答案。 我不太了解代表和异步等等 – 所以请给我一个如何实现的一般例子。 我有一个工作流程,我可以使用Parallel.Foreach同时为许多不同的文件执行一个方法(甜,研磨处理器) – 但是在该方法结束后我需要运行另一个方法(它生成一个报告过程),这第二种方法不能并行运行。 我不想等待Parallel.ForEach中的所有文件在生成报告之前完成(这是不必要的)。 但是,如果我在第一个方法结束时启动报告生成方法,那么我会遇到问题。 是否有某种队列或什么? 必须有一些漂亮的方式,对吧? 谢谢

在foreach循环中使用parallel.foreach和task之间的性能差异是什么?

我想知道什么是最好的方法,或者是否有任何文档/文章可以帮助我确定在每个循环的正常情况下使用Parallel.foreach和Task的区别是什么,如下所示: 案例1 – Parallel.foreach: Parallel.foreach { // Do SOmething thread safe: parsing an xml and then save // into a DB Server thry respoitory approach } 案例2 – foreach中的任务: foreach { Task t1 = Task.factory.startNew(()=> { //Do the same thing as case 1 that is thread safe } } Task.waitall() 我确实进行了自己的测试,结果显示案例1的表现优于案例2.比例大致如下:顺序vs案例1 vs案例2 = 5s:1s:4s 虽然案例1和案例2几乎有1:4? […]

线程和SqlFileStream。 该进程无法访问指定的文件,因为它已在另一个事务中打开

我正在提取SQL文件表中的文件的内容。 如果我不使用Parallel,以下代码可以正常工作。 我同时读取sql文件流(并行)时遇到以下exception。 该进程无法访问指定的文件,因为它已在另一个事务中打开。 TL; DR: 在Parallel.ForEach中从FileTable读取文件(使用GET_FILESTREAM_TRANSACTION_CONTEXT)时,我得到上述exception。 示例代码供您试用: https://gist.github.com/NerdPad/6d9b399f2f5f5e5c6519 更长版本: 获取附件,并提取内容: var documents = new List(); using (var ts = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled)) { var attachments = await dao.GetAttachmentsAsync(); // Extract the content simultaneously // documents = attachments.ToDbDocuments().ToList(); // This works Parallel.ForEach(attachments, a => documents.Add(a.ToDbDocument())); // this doesn’t ts.Complete(); } DAO读取文件表: public async Task<IEnumerable> GetAttachmentsAsync() { […]