草庐IT

array_parallel

全部标签

c# - 如何保证 Array 中 "reference type"项目的更新对其他线程可见?

privateInstrumentInfo[]instrumentInfos=newInstrumentInfo[Constants.MAX_INSTRUMENTS_NUMBER_IN_SYSTEM];publicvoidSetInstrumentInfo(Instrumentinstrument,InstrumentInfoinfo){if(instrument==null||info==null){return;}instrumentInfos[instrument.Id]=info;//needtomakeitvisibletootherthreads!}publicInstru

c# - 为什么 Interlocked.Increment 在 Parallel.ForEach 循环中给出不正确的结果?

我有一项迁移工作,完成后我需要验证目标数据。为了通知管理员验证成功/失败,我使用计数器比较数据库1中表Foo的行数与数据库2中表Foo的行数。Database2中的每一行都根据Database1中的相应行进行验证。为了加快这个过程,我使用了一个Parallel.ForEach循环。我最初的问题是计数总是与我的预期不同。后来发现+=和-=操作不是线程安全的(不是原子的)。为解决此问题,我更新了代码以在计数器变量上使用Interlocked.Increment。这段代码打印出一个更接近实际计数的计数,但是,每次执行似乎都不同,它没有给出我期望的结果:PrivatecountObjectsA

c# - 为什么 foreach(var i in array2D) 适用于多维数组?

给定以下C#代码:int[,]array2D=newint[10,10];intsum=0;foreach(variinarray2D){sum+=i;}问题是:是什么导致了i的类型?被正确推断为int?这一点都不明显,因为array2D是一个矩形数组。它没有实现IEnumerable.它还实现了一个GetEnumerator()方法,返回System.Collections.IEnumerator.因此,我希望i类型为object.我的代码使用的是.net4.03。相关问题:WhydoC#MultidimensionalarraysnotimplementIEnumerable?.

c# - 替换 NetCore 1.0 中的 Array.ConvertAll

我当前的代码正在使用Array.ConvertAll,我需要将其迁移到netcore1.0。如何将其迁移到NetCore中工作。我们可以使用带有自定义转换代码的foreach语句来处理转换吗?但我不知道该怎么做。感谢任何帮助。 最佳答案 代替int[]array1=...string[]array2=Array.ConvertAll(array1,element=>element.ToString());您可以使用Linq:int[]array1=...string[]array2=array1.Select(element=>el

c# - Parallel.For 在大约 1370 次迭代后卡住,不知道为什么

我正在对7500多个对象运行Parallel.For循环。在那个for循环中,我对每个对象做了很多事情,特别是调用两个Web服务和两个内部方法。Web服务只是检查对象、处理并返回一个字符串,然后我将其设置为对象的属性。两个内部方法也是如此。我没有将任何内容写入磁盘或从磁盘读取。我还使用标签和进度条更新了winforms应用程序中的UI,让用户知道它的位置。这是代码:vartask=Task.Factory.StartNew(()=>{Parallel.For(0,upperLimit,(i,loopState)=>{if(cancellationToken.IsCancellation

c# - Parallel Linq - 使用比处理器更多的线程(对于非 CPU 绑定(bind)任务)

我正在使用并行linq,我正在尝试使用如下基本代码同时下载许多url:intthreads=10;Dictionaryresults=urls.AsParallel(threads).ToDictionary(url=>url,url=>GetPage(url);由于下载网页受网络限制而不是CPU限制,因此使用比我的处理器/内核数量更多的线程是非常有益的,因为每个线程的大部分时间都花在等待网络catch。然而,根据在我的双核机器上运行threads=2与threads=10具有相同性能的事实判断,我认为发送到AsParallel的线程数受限于核心数。有什么方法可以覆盖这种行为吗?是否有

c# - Parallel.For 和 Break() 的误解?

我正在研究For循环中的并行中断。看完this和this我还有一个问题:我希望这段代码:Parallel.For(0,10,(i,state)=>{Console.WriteLine(i);if(i==5)state.Break();}最多生成6个数字(0..6)。不仅他没有这样做,而且结果长度不同:023514860135420135642非常烦人。(Break(){after5}到底在哪里??)于是我看了一下msdnBreakmaybeusedtocommunicatetotheloopthatnootheriterationsafterthecurrentiterationnee

c# - Stop vs Break in Parallel.For

我很难理解loopState.Stop()和loopState.Break()。我已经阅读了MSDN和几篇关于它的帖子,但我仍然感到困惑。我的理解是,每个迭代分区程序都为线程提供剩余索引以供处理,loopState.Stop()停止所有线程,loopState.Break()停止当前线程线程。但是让我们考虑以下情况:Parallel.For(0,100,(i,loopState)=>{if(i>=10)loopState.Break();Debug.Write(i);});对于这个循环我有以下结果:02512345678910我不知道为什么结果中有10和25个数字。有人可以帮忙吗?附言

c# - : List<T>. Add() 或 System.Array.Resize() 哪个更有效?

我正在尝试确定何时使用List.Add()更有效与使用Array.Resize()相比方法。Array.Resize的文档说它复制了整个数组,并将其放入一个新对象中。旧对象将不得不被丢弃。这个旧对象在哪里?在栈上还是堆上?我不知道List.Add()是如何工作的。有谁知道List.Add方法与静态Array.Resize方法相比如何?我对内存使用(和清理)以及300种值类型和20,000种值类型哪个更好。就其值(value)而言,我计划在.NET的一种嵌入式版本上运行此代码。可能是.NETGadgeteer 最佳答案 你应该使用Li

c# - 在 Parallel.For 中发送多个 WebRequest

我想发送多个WebRequest。我使用了Parallel.For循环来执行此操作,但该循环运行一次,第二次在获得响应时出错。错误:Theoperationhastimedout代码:Parallel.For(0,10,delegate(inti){HttpWebRequestrequest=(HttpWebRequest)WebRequest.Create(newUri("http://www.mysite.com/service"));stringdataToSend="Data";byte[]buffer=System.Text.Encoding.GetEncoding(1252