Is AsParallel().ForAll reliable
我有asparallel()的查询.forall有时会跳过一些记录,有时在我的情况下返回零记录. 我不确定这是这样做的确切原因. 在.NET可靠的Parellal的机制? 编辑: 示例代码 var collection=.. Collection from database var processedCollection=... collection.Where(h => h.Id == id).AsParallel().ForAll(h => { var processedCollectionItem = ....logic to process the item processedCollectionItem.Where(c=>c.....).AsParallel().ForAll(c => { //logic to process the records }); processedCollection.Add
6 2024-04-26
编程技术问答社区
用Parallel.ForEach获取目录
我有一种在目录上递归并建造树的方法: public void RecurseFolders(TreeNode mainNode) { DirectoryInfo nodeDir = new DirectoryInfo(mainNode.Tag.ToString()); try { foreach (var dir in nodeDir.GetDirectories()) { int index = GetSystemIcon(dir.FullName, treeView1.ImageList, false); var subNode = new TreeNode(dir.Name, index, index); subNode.Tag = dir.FullName; mainNode.Nodes.Add(subNode); RecurseFolders(subNode); } } catch (
16 2024-04-26
编程技术问答社区
在dotnet core中分批使用Parallel.For
我在dotnet core中使用httptrigger函数,其中我以json格式获得httprequest数据.我需要在Google商家中心帐户中插入此值.需要插入近9000行(每次动态数据).我如何实现平行.用于更快地执行的逻辑.目前,我在下面的每个循环中都使用,但这需要更多时间. 以下是代码. string requestBody = await new StreamReader(req.Body).ReadToEndAsync(); dynamic body = JsonConvert.DeserializeObject(requestBody); for (int i =0;i
14 2024-04-26
编程技术问答社区
如何并行知道每个线程的线程ID
我有这样的场景: int arr[100]; Parallel.Foreach(arr, (a) => { some processing}); 现在,此代码将产生100个子线程.我怎么能在"某些处理"逻辑中知道每个子线程的线程ID? 解决方案 您可以使用 Thread.CurrentThread.ManagedThreadId 但请注意,您的平行foreach不是强制实际创建100个线程.
12 2024-04-25
编程技术问答社区
包含异步和同步的平行循环
我有一个循环需要并行运行,因为每次迭代都很慢,而且处理器密集型,但是我还需要将异步方法称为循环中每种迭代的一部分. 我已经看到了有关如何处理循环中的异步方法的问题,而不是异步和同步的组合,这是我所拥有的. 我(简化的)代码如下 - 我知道由于将异步操作传递给foreach. protected IDictionary GetReportData() { var results = new ConcurrentDictionary(); Parallel.ForEach(requestData, async data => { // process data synchronously var processedData = ProcessData(data); // get some data async
4 2024-04-25
编程技术问答社区
对hashset的简单并行化
我有2个循环(嵌套),试图做一个简单的并行化 pseudocode : for item1 in data1 (~100 million row) for item2 in data2 (~100 rows) result = process(item1,item2) // couple of if conditions hashset.add(result) // while adding, incase of a duplicate i also decide wihch one to retain process(item1,item2)如果条件基于ITEM1和ITEM2中的值,则具有4个.(所需的时间小于50ms) data1大小为NX17 data2大小为NX17 result大小为1x17(将结果连接到字符串中,然后将其添加到哈希集中) 最大输出尺寸:未知,但我想准备至少5亿 这意味着标签将持有5亿个物品
14 2024-04-24
编程技术问答社区
用取消令牌停止Parallel.ForEach和停止
我不确定我是否会像打算这样做那样停止Parallel.ForEach循环. 因此,让我概述问题. 循环使用可用连接有限的数据库驱动程序,需要跟踪打开的连接,因此数据库驱动程序不会引发异常.问题在于手动跟踪开放连接(应该重新分配 - 编写包装器或使用AutoResetEvent>),但是还有其他一些需要首先处理的事情).因此,我需要跟踪开放连接,尤其是我必须处理一个例外的情况: Parallel.ForEach(hugeLists, parallelOptions, currentList => { WaitForDatabaseConnection(); try { Interlocked.Increment(ref numOfOpenConnections); DoDatabaseCallAndInsertions(); } catch (Exception ex) { // logging throw; } fi
16 2024-04-24
编程技术问答社区
Parallel.Foreach()没有产生任何结果
我试图使用Parallel.ForEach()质疑蒙古-DB,但我没有得到任何结果.但是,当我尝试在常规foreach循环中运行同一件事时,我可以执行预期的任务. var exceptions = new ConcurrentQueue(); var secondaryObjectsDictionaryCollection = new Dictionary>(); // This works foreach(var info in infos) { try { name = await commonValidator.ValidateAsync(name); await commonValidator.ValidateIdAsync(name, id); var list = await helper.ListRelatedObjectsAsync(n
16 2024-04-24
编程技术问答社区
如何并行地迭代一个动态估值的字典?
我试图使用dict中的值的副本将每个循环中的螺纹呈现在每个循环中. 我最初的理解是foreach将创建一个新的范围,并导致: Dictionary Dict = new Dictionary() { { "sr1", "1" }, { "sr2", "2" } }; foreach (KeyValuePair record in Dict) { new System.Threading.Timer(_ => { Console.WriteLine(record.Value); }, null, TimeSpan.Zero, new TimeSpan(0, 0, 5)); } 写 1 2 2 2 而不是(预期): 1 2 1 2 所以我尝试将KVP克隆到foreach中: KeyValuePair
8 2024-04-24
编程技术问答社区
Parallel.ForEach中的迭代器是在多个线程上运行的
我有一些我在Parallel.ForEach循环中运行的代码.循环中的代码是线程安全的,但是我正在使用的迭代器(具有yield return>>的自定义方法)不是.看来迭代器正在运行在多个线程上,这可能会引起问题. 问题背景 迭代器包含呼叫Nhibernate的呼叫(尽管您稍后会看到这完全是偶然的),并且由于我对我在NHIBERNATE PROFILER中所看的代码的问题遇到了问题,以查看是否可以阐明情况.通过它的一部分开始报告"在多个线程中使用单个会话可能是一个错误". 现在,根据NHIBERNATE PROFILER,有问题的代码在迭代器内部(因此,它并没有试图在Parallel.ForEach操作中实现其他位置).因此,我添加了一些自己的代码,以便可以检测到Nhibernate Profiler是什么,我看到了同一件事. 从多个线程调用迭代方法 - 我认为这是不可能的,就像其他人似乎也认为,例如另一个这样答案: https://stackoverflow.c
10 2024-04-24
编程技术问答社区
Parallel.ForEach和DataTable-Isn'DataTable.NewRow()是一个线程安全的 "读 "操作?
我正在转换现有应用程序以利用多个处理器.我有一些嵌套的环,然后将最内部的循环转换为平行的foreach循环.在原始应用程序中,在内部最多的循环内,代码将调用DataTable.NewRow()实例化适当布局的新数据,填充列,然后将填充的数据添加到使用DataTable.Add()的数据表中.但是,由于DataTable只是用于读取操作的线程安全,因此我已将处理转换为添加填充的DataRow对象中的ConcurrentBag对象.然后,一旦平行循环循环完成,我会迭代consturrentbag,然后将datarow对象添加到数据表中.看起来像这样... DataTable MyDataTable = new DataTable() // Add columns to the data table For(int OuterLoop = 1; OuterLoop
14 2024-04-23
编程技术问答社区
如何指定在Parallel.ForEach中执行的并行任务的数量?
我有〜500个任务,每个任务都需要约5秒钟,在等待远程资源回复时浪费了大多数时间.我想定义应(测试之后)应该产生的线程数,并在这些线程上运行任务.当一个任务完成时,我想在线程上产生另一个任务. 我找到了System.Threading.Tasks最容易实现我想要的东西,但是我认为不可能指定应该并行执行的任务数量.对于我的机器,它总是大约8(Quad Core CPU).是否有可能以某种方式并行执行多少个任务?如果不是,那么最简单的方法是实现我想要的? (我尝试了线程,但是代码要复杂得多).我尝试增加MaxDegreeOfParallelism参数,但这仅限制了最大数字,所以这里没有运气... 这是我当前拥有的代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Co
8 2024-04-23
编程技术问答社区
.NET 6中的并行操作中的MaxDegreeoFarallelism = -1的含义是什么?
MaxDegreeOfParallelism属性会影响传递此ParallelOptions实例的Parallel方法调用的并发操作数量.正属性值将并发操作的数量限制为设定值.如果是-1,则同时运行操作的数量没有限制. 默认情况下,For和ForEach将使用基础调度程序提供的许多线程,因此从默认值中更改MaxDegreeOfParallelism仅限限制将使用多少并发任务. 我试图理解在这种情况下的含义.根据文档的上述摘录,我的期望是A Parallel.Invoke 配置MaxDegreeOfParallelism = -1的操作将立即在并行中立即执行提供的actions.但这不是发生的事情.这是一个有12个动作的实验: int concurrency = 0; Action action = new Action(() => { var current = Interlocked.Increment(ref concurrency); Console
我可以在平行循环中使用局部变量(无意地重写上一个值)
因此,我试图一次从数据表一行处理记录.我是多线程环境的新手,被要求使用Parallel.Foreach循环.我想知道如何在并行执行模式下处理本地变量.以下是我的代码. Parallel.ForEach(dtReportData.Tables[0].AsEnumerable(), drow => { string strType = drow["type"]; //Based on this type, I am executing logic from a switch case. }); 现在.我想知道我是否可以声明并将值分配给循环中的变量. 对于一个实例,让我们假设有2个并行运行的线程. 螺纹1获取记录,假设获取的值是" type1"并存储到strtype中. 现在,我希望我的代码执行类型" type1"的逻辑(假设我们已经为其编写了开关案例) 但是,让我们假设在线程1开始执行逻辑之前,线程2开始发挥作用.线程2将值" type2"分配给strtype.
6 2024-04-22
编程技术问答社区
立即停止Parallel.ForEach
我在每个循环中停止平行的问题. 我正在迭代一组从表中检索到的大约40.000个数据线,当我的结果集中有100个项目时,我需要立即停止循环.问题在于,当我在parallelloopstate上触发停止方法时,迭代不会立即停止,从而导致我的结果集不一致(要么很少或很多项目). 我无法确保,一旦我撞到停止,我就会杀死所有线程? List rows = new List(dataTable.Select()); ConcurrentDictionary resultSet = new ConcurrentDictionary(); rows.EachParallel(delegate (DataRow row, ParallelLoopState state) { if (!state.IsStopped) { using (SqlC
10 2024-04-22
编程技术问答社区
使用Parallel.foreach和foreach循环内部任务之间有什么性能差异?
我想知道什么是最好的方法,或者有任何文档/文章可以帮助我确定使用并行使用的区别. 每个循环,如下: 案例1-并行. 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?因此,这意味着我们应该始终使用并行使用. 解决
2 2024-04-21
编程技术问答社区
如何防止并行.foreach循环在运行时更改任务数?
我正在使用Parallel.ForEach循环进行一些工作,然后用localInit来初始化它: localInit: () => new { foo = new Foo(), bars = CreateBars(), } 根据文档: localInit,或初始化螺纹 - 本地变量的函数. 每个分区都调用此功能一次 Parallel.ForEach操作执行.我们的示例初始化 螺纹 - 本地变量为零. 所以我尝试使用它,但是我观察到循环正在不断杀死和创建新任务,从而导致频繁调用localInit.这是我的选择适得其反,无法根据需要起作用. 我认为Parallel.ForEach将创建例如四个分区时,它将使它们活着,直到对所有项目进行介绍,但事实并非如此.它正在调用localFinally和localInit几个带有一些Thousend物品的收藏的时间.如何这样? 可以以某种方式预防这种行为吗?我真的希望节省一些资源,但它并
10 2024-04-20
编程技术问答社区
从foreach循环转换为平行.
我有C#代码的一部分,如下所示.该代码总结了数据表中的"双打"列: var data = this.Db.ExecuteRead(query, this.Score.Name); var time = 0.0; foreach (DataRow row in data.Rows) { time += this.ParseDouble(row[0].ToString()) / MillisecondsPerMinute; } 此代码需要4秒才能执行.我想加快它的速度,所以我将其平行如下: Parallel.ForEach( data.AsEnumerable(), row => { time += this.ParseDouble(row[0].ToString()) / MillisecondsPerMinute;
14 2024-04-20
编程技术问答社区
并行 - 将项目添加到迭代或等效的集合中?
现在,我有一个C#程序,可以以反复出现的基础执行以下步骤: 从数据库中获取当前任务列表 使用Parallel.ForEach(),为每个任务工作 但是,其中一些任务非常长.这延迟了其他待处理任务的处理,因为我们只在程序开始时寻找新任务. 现在,我知道修改集合的迭代不可能(对吗?),但是在C#Parallel框架中是否有一些等效的功能,可以使我可以将工作添加到列表中,同时还可以处理项目在列表中? 解决方案 一般而言,您是对的,在不允许迭代时修改集合时,您是对的.但是您还可以使用其他方法: 使用 ActionBlock .代码看起来像: var actionBlock = new ActionBlock( task => DoWorkForTask(task), new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = DataflowBlockOpt
10 2024-04-20
编程技术问答社区
C# Parallel.Foreach等同于Python
我有96个TXT文件必须处理.现在,我正在使用一个用于循环,并且一次使用它们,此过程非常慢.由此产生的96个文件,不需要合并.有没有一种方法可以使它们并行运行,Ala并行运行. 当前代码: 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中的所有文件并行运行. 解决方案 假设限制因素确实是处理,而不是I/O,您可以使用 a 他们的文档中的简单示例: >>> from math import sqrt >>> from job
12 2024-04-19
编程技术问答社区