问题标签 [parallel.foreach]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1157 浏览

asp.net - 在 WCF 服务中返回值后如何继续处理

我有一个 WCF 服务,它依次调用其他几个 Web 服务。这些服务按优先顺序排序,但并行调用。每个服务都会以 true 或 false 进行响应,当所有响应都收到后,最喜欢的肯定会返回给客户端。

但是,在此期间的任何时候,最喜欢的服务都可能会做出积极的回应。此时继续查询其他服务没有意义,所以我希望取消执行并将结果返回给客户端。

我能做的就这么多:

上面的代码是我的代码的一个非常简化的版本,但本质上它会检查每个响应以查看它是否是当前最受欢迎的服务。如果是这样,它会取消循环。

但是...以这种方式取消循环将等待已经调用的任何服务在终止循环之前完成。任何服务都有可能超时,这当然被视为否定。如果只是其中一个超时,它会在我的响应时间上增加 10 秒。

我想做的是以下之一:

  1. 将首选服务返回给客户端,然后继续处理来自已经启动的服务的响应(这纯粹是为了记录目的,以便我知道这些服务的正/负率)。
  2. 立即取消循环并忘记剩余的响应。理想情况下,我不想这样做,因为这意味着将不会记录本应积极响应的服务,这将影响他们的偏好评级。

所以我的问题是:

我想要实现的目标可能吗?我意识到 parallel.foreach 可能不是这项工作的最佳工具,或者我可能无法在响应客户端后记录响应。最重要的要求是当“赢家”已经被选中时,客户端无需等待服务响应即可收到快速响应。

0 投票
2 回答
310 浏览

c# - 阻止或禁止使用 Parallel.ForEach

我在上面编写了一个库,System.Data.SQLite并意识到它(我的库)在使用Parallel.ForEach. 我最终可能会调试这个(即如果我得到/花时间),最有可能通过锁定正确的部分,但现在假设我只想阻止使用Parallel.ForEach,或强制使用我的库以允许(或导致)只有一个线程,我将如何进行?

0 投票
2 回答
1547 浏览

c# - Parallel.ForEach 最后没有线程

我正在测试一个应该编译很多项目/文件的应用程序。

我有一个 ConucrrentBag,应该与 Parallel 一起使用。

我对并行的呼吁是这样的:

MaxProcess 的数量是LogicalCpu*2。

当我编译 140 个项目时,到最后 Parallel 将启动线性较少的线程。至少最后 4 个项目只有一个线程在运行。这不是很好,但没关系。

现在我的问题:

当我编译大约 14000 多个项目时(它是 COBOL-SOURCE ;-) 和一个非常大的系统)最后一个模块不会被编译,因为 Parallel.ForEach 没有为此启动新线程。此时没有有效的工作线程。但是concurrentBag 中仍然有140 个项目。

有人知道如何解决这个问题吗?

编辑:该问题仅在我运行编译器时发生。不运行编译器(为了更快的测试)它工作得很好......

编辑:

当我启动 Parallel.ForEach 进程时,ConcurrentBag 已经完全填充。

有关详细信息,SingleProcess 中的代码:

这里是 CobolCompiler 类的代码片段:

公共无效编译(字符串文件){

我只是在每次编译过程后睡了两秒钟就试过了。但这不会改变任何事情。

在编译过程中,CPU 为 100%。该应用程序正在收集 270 MB RAM。开始时只有 35MB。

不要害怕,我必须将所有源复制到临时文件夹,因为编译器无法在同一个工作目录中同时编译多个文件。

编辑: 我已经解决了没有线程但仍然有项目的问题。

在 ProcessSingle 中,当它未链接到 dll 时,我添加了我尝试再次编译的项目。

所以我从 14000 个项目开始,并在处理 Parallel.ForEach 时再次将项目(如果它们无法链接)添加到这个 concurrentBag。所以我以 14000 次 ForEach 运行结束,并且有 xxx 模块必须再次编译。:-(

我没看到。没有 WaitForExit 的 prReschk 的运行是有意的。因为检查超过 14000 个项目的资源需要很长时间,并且不应妨碍新的编译。

但是 ConcurrentBag 结束时线程较少的问题仍然存在 :( 但它只是在大量循环时才注意到。

0 投票
1 回答
1046 浏览

c# - 使用 Parallel.ForEach 时的 System.AggregateExeption

由于缺乏更好的选择,我正在构建这个网络爬虫来从他们的搜索中收集 Steam 配置文件 ID。

它应该作为服务运行,但我无法使其工作。如果我复制代码并将其作为控制台应用程序运行,它会完美运行。

我是 Windows 服务编程和使用并行任务的新手,所以如果还有其他完全关闭或效率低下的东西,请赐教,但手头的问题更重要。

我尝试使用 eventviewer 对其进行调试,但我对这些东西也很陌生,我发现它非常乏味并且不知道要寻找什么。

下面是在控制台应用程序中工作的代码,但不是作为 Windows 服务。为什么它只能在控制台应用程序中工作?

来自 eventviwer 的堆栈。源被列为 .NET 运行时

应用程序:SSIDGatherer.exe 框架版本:v4.0.30319 描述:进程因未处理的异常而终止。异常信息:System.AggregateException 堆栈:在 System.Threading.Tasks.Parallel.ForWorker[[System._Canon , mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]](Int32, Int32, System.Threading .Tasks.ParallelOptions, System.Action 1<Int32>, System.Action2, System.Func 4<Int32,System.Threading.Tasks.ParallelLoopState,System.__Canon,System.__Canon>, System.Func1, System.Action 1<System.__Canon>) at System.Threading.Tasks.Parallel.ForEachWorker[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]](System.__Canon[], System.Threading.Tasks.ParallelOptions, System.Action1, System.Action 2<System.__Canon,System.Threading.Tasks.ParallelLoopState>, System.Action3, System.Func 4<System.__Canon,System.Threading.Tasks.ParallelLoopState,System.__Canon,System.__Canon>, System.Func5, System.Func 1<System.__Canon>, System.Action1) 在 System.Threading.Tasks.Parallel.ForEachWorker[[System. _Canon,mscorlib,版本=4.0.0.0,文化=中性,PublicKeyToken=b77a5c561934e089],[System._佳能,mscorlib,版本=4.0.0.0,文化=中性,PublicKeyToken=b77a5c561934e089]](System.Collections.Generic.IEnumerable 1<System.__Canon>, System.Threading.Tasks.ParallelOptions, System.Action1,System.Action 2<System.__Canon,System.Threading.Tasks.ParallelLoopState>, System.Action3,System.Func 4<System.__Canon,System.Threading.Tasks.ParallelLoopState,System.__Canon,System.__Canon>, System.Func5,System.Func 1<System.__Canon>, System.Action1)在 System.Threading.Tasks .Parallel.ForEach[[系统。_Canon,mscorlib,版本=4.0.0.0,文化=中性,PublicKeyToken=b77a5c561934e089]](System.Collections.Generic.IEnumerable1<System.__Canon>, System.Action1) 在 SSIDGatherer.SSIDGatherer.Treading() 在 System.Threading.ThreadHelper.ThreadStart_Context(System.Object) 在 System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)在 System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object) 在 System.Threading.ThreadHelper.ThreadStart()

0 投票
4 回答
25428 浏览

c# - Parallel.Invoke 和 Parallel.ForEach 本质上是一样的吗?

“相同的事情”我的意思是这两个操作基本上做同样的工作,它只是归结为根据你必须使用的内容调用哪个更方便?(即代表列表或要迭代的事物列表)?我一直在搜索 MSDN、StackOverflow 和各种随机文章,但我还没有找到明确的答案。

编辑: 我应该更清楚;我在问这两种方法是否做同样的事情,因为如果他们不这样做,我想了解哪种方法更有效。

示例:我有一个包含 500 个键值的列表。目前我使用一个foreach循环遍历列表(串行)并为每个项目执行工作。如果我想利用多个核心,我应该简单地使用Parallel.ForEach吗?
假设为了争论,我有一个包含 500 个代表的数组来处理这 500 个任务 - 最终效果会是任何不同的调用Parallel.Invoke并给它一个包含 500 个代表的列表吗?

0 投票
1 回答
874 浏览

c# - 使用 WebClient 时出现 Parallel.ForEach 错误

首先,我的免责声明:我是一个平行的菜鸟。我认为这将是一个容易解决的“令人尴尬的并行”问题,但它让我陷入了循环。

我正在尝试从网上并行下载一些照片。原始照片是高分辨率的,占用了相当多的空间,所以我会在下载后压缩它们。

这是代码:

所以这就是让我感到困惑的地方:每张照片都命中了该webClient.DownloadFile行的 SavePhotoFile() 方法的 Catch{} 块。错误消息是在 WebClient 请求期间发生的异常,内部详细信息是“进程无法访问文件...... -original.jpg,因为它正在被另一个进程使用。”

如果我对这个错误还不够困惑,那么接下来会发生什么让我更加困惑。事实证明,如果我只是忽略消息并等待,图像最终会下载并被处理。

这是怎么回事?

0 投票
7 回答
15043 浏览

c# - Parallel.ForEach 调试或单步执行

有没有一种简单的方法可以逐步完成parallel.foreach?用断点调试它的最佳方法是什么?

0 投票
2 回答
2433 浏览

c# - Parallel.ForEach 与 ListView

我有以下代码:

我得到以下编译错误:

无法从用法中推断出方法“System.Threading.Tasks.Parallel.ForEach(System.Collections.Concurrent.OrderablePartitioner, System.Threading.Tasks.ParallelOptions, System.Action)”的类型参数。尝试明确指定类型参数。

我搜索了如何在任务中使用 listview,但找不到任何东西。

如何将 Parallel.ForEach 与 ListView 一起使用?

0 投票
1 回答
64 浏览

c# - 请求速度

我有代码通过两个并行为每个循环发送 Web 请求。在此方法发生之前添加线程会导致这些任务的执行延迟,还是会实现更多的 Web 请求?

//...

//..

0 投票
1 回答
1495 浏览

.net - 如何取消任何当前的 Parallel.ForEach 并重新开始

从功能上讲,有一长串单词绑定到 ListView。使用 TextBox for chars 过滤单词列表。

使用任何新的 char 需要取消任何处理背景过滤器。然后等待 1 秒 (DispatcherTimer) 以启动新的后台并行过滤器。

使用 BackGroundWorker 进行此工作,但无法将 cancel-any-processing 部分转换为 Parallel。基本上需要“if (backgroundWorkerFTSfilter.IsBusy) backgroundWorkerFTSfilter.CancelAsync();” 在平行下。
如果我要解决这个错误,请告诉我。

Irman 的回答使我想到了这一点

非常感谢我的回答,并将将其用于一些运行时间更长的任务或更长的列表,但获得了如此出色的性能,我将其移至 get(仍然有 1 秒的延迟)。导致更小的内存占用。针对 800,000,它的运行时间不到 1/10 秒。