问题标签 [parallel-extensions]
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.
c# - 何时处置 CancellationTokenSource?
该类CancellationTokenSource
是一次性的。快速浏览一下 Reflector 就证明KernelEvent
了(很可能)非托管资源的使用。由于CancellationTokenSource
没有终结器,如果我们不处置它,GC 就不会这样做。
另一方面,如果您查看 MSDN 文章Cancellation in Managed Threads中列出的示例,则只有一个代码片段处理了令牌。
在代码中处理它的正确方法是什么?
using
如果您不等待,则无法包装开始并行任务的代码。只有在您不等待的情况下取消才有意义。- 当然,您可以
ContinueWith
通过调用添加任务Dispose
,但这是要走的路吗? - 可取消的 PLINQ 查询不同步回来,但只是在最后做一些事情呢?比方说
.ForAll(x => Console.Write(x))
? - 它可以重复使用吗?是否可以将同一个令牌用于多个调用,然后将其与宿主组件一起处置,比如 UI 控件?
因为它没有类似于Reset
清理IsCancelRequested
和Token
字段的方法,所以我认为它不可重用,因此每次启动任务(或 PLINQ 查询)时,都应该创建一个新任务。这是真的吗?Dispose
如果是,我的问题是在这些情况下处理的正确和推荐策略是什么CancellationTokenSource
?
c# - Parallel.For 步长
有谁知道是否有任何过载可以让我在 Parallel.For 循环中指定步长?c# 或 VB.Net 中的示例会很棒。
谢谢,贡萨洛
task-parallel-library - Silverligh 5 SDK RC + Async CTP:让它工作
刚刚安装了 Silverligh 5 SDK RC。在使用 Async CTP 的项目中使用它时出现问题。
AsyncCtpLibrary_Silverlight.dll 和 mscorlib.dll 都包含位于完全相同命名空间中的任务类型(以及其他一些与任务相关的类型)。
这是错误消息:
因此,为了解决这种歧义,我将 AsyncCtpLibrary_Silverlight.dll 上的别名更改为“AsyncCtp”。然后相应地更改了cs文件:
这似乎解决了歧义问题,但现在无法识别“async”关键字。这些是相关的错误:
有没有办法绕过它,或者它是一个死胡同?
c# - 在任务中抛出异常 - “await” vs Wait()
在 TPL 中,当在 Task 中抛出异常时,它会被 AggregateException 包装。但是在使用await关键字
时不会发生同样的情况。
这种行为的解释是什么?
c# - 异常未被捕获
我有一个非常简单的应用程序,我们向它提供我们网站的列表,它对它们执行并行 foreach,并且在每个操作中它都会向它发送一个 http post。
类似于下面:
我不知道为什么它会抛出 OutOfMemoryException,更不用说为什么这会导致整个应用程序崩溃,而不仅仅是捕获并继续。
编辑:不完全确定异常发生在哪里,因为它不在本地,只有在生产中运行时......意味着没有可用的调试。该应用程序是 64 位的,很少使用超过 100 兆。
c# - 由于并行性而提取方法的问题
我想将以下代码提取到一个新方法中:
PSTLooper
是类型IEvaluator
,我还有其他几个IEvaluator
我想用这种方法测试。该方法应该尽可能快地执行,现在我对 Parallel.For 的性能非常满意(我很想了解更快/更好的方法)。
我需要为每个线程生成一个新对象,并为我的EvalEnumeration(int instance)
方法生成当前线程数。由于这些限制,几次尝试都失败了。
我的一些尝试:
该方法可以编译,但仅使用IEvaluator
并且不创建新方法。
那不编译,因为我需要# of Instance。
我很确定我的方法不是最好的,但现在我不知道更好,因此需要在这里问这个问题。
.net - 如何使用联接对现有的 LINQ 查询进行 PLINQ?
我正在使用 LINQ 将两个数据集相互比较以创建新行并更新现有行。我注意到完整的比较持续了大约 1.5 小时,并且两个核心中只有一个处于忙碌状态(任务管理器的 CPU 使用率为 50-52%)。我必须承认我对并行 LINQ 完全陌生,但我认为它可以显着提高性能。
所以我的问题是,我应该如何以及什么并行化?
这些是原始查询(简化为要点):
注意: daContact
and daContactDetails
are SqlDataAdapters
, source
and dest
areDataSets
和Contact
and ContactDetail
are DataTables
, 其中每个 ContactDetail 都属于一个联系人。
即使不是两个核心都使用 100% CPU,我认为如果我并行化查询会显着提高性能,因为第二个核心几乎是空闲的。这for each
也可能是一个优化的好地方,因为票证彼此不相关。所以我假设我可以循环使用多个线程并并行创建/更新记录。但是如何用 PLINQ 做到这一点?
旁注:正如我在评论中提到的那样,到目前为止,性能对我来说并不是一个关键因素,因为服务器的唯一目的是将 MySQL 数据库(在另一台服务器上)与 MS SQL 服务器(在同一台服务器上)同步作为这个 Windows 服务)。它充当由其他服务生成的报告的来源。但这些报告每天只生成一次。但除此之外,我对学习 PLINQ 很感兴趣,因为我认为这可能是一个很好的练习。仅当目标数据库为空并且必须创建所有记录时才需要提到的 1,5h。如果两个数据库几乎同步,则此方法只需约 1 分钟。在未来的表现将变得更加重要,因为电子邮件只是几种联系类型中的一种(聊天+通话将超过 100 万条记录)。我认为无论如何我都需要某种(LINQ)数据分页。
如果有不清楚的地方,我会相应地更新我的答案。提前致谢。
编辑:这是我的调查和尝试的结果:
问题:如何使用连接“PLINQ”现有的 LINQ 查询?
答:请注意,一些 LINQ 运算符是二进制的——它们将两个 IEnumerables 作为输入。Join 是这种运算符的完美示例。在这些情况下,最左侧数据源的类型决定了使用 LINQ 还是 PLINQ。因此,您只需在第一个数据源上调用 AsParallel 即可让您的查询并行运行:
但是,如果我以下列方式更改我的查询(注意AsParallel
):
编译器会抱怨我也需要添加AsParallel
到正确的数据源。所以这似乎是一个 VB.NET 问题或缺乏文档(文章来自 2007 年)。我假设是后者,因为(除了那篇值得推荐的)文章还说您需要System.Concurrency.dll
手动添加,但实际上它是 .NET 4.0 Framework 和 Namespace 的一部分Sytem.Threading.Tasks
。
我意识到我不会从并行化中受益,Except
因为查询在顺序模式下足够快(即使两个集合中的行数几乎相同,这会导致最大比较次数,我在不到 30 秒内就得到了结果)。但为了完整起见,我稍后会添加它。
因此,我决定将for-each
与 LINQ 查询一样简单的东西并行化,您只需AsParallel()
在最后添加即可。但我意识到我需要强制使用 .NET 的并行性WithExecutionMode(ParallelExecutionMode.ForceParallelism)
,否则 .NET 决定在这个循环中只使用一个核心。我还想告诉 .NET 我希望使用尽可能多的线程,但不超过 8 个:WithDegreeOfParallelism(8).
现在两个内核同时工作,但 CPU 使用率保持在 54%。
所以这是迄今为止的 PLINQ 版本:
AsParallel
不幸的是,与顺序模式相比,我没有看到任何性能优势:
与for each
(AsParallel
hh:mm:ss.mm):
并且没有:
有人可以解释一下这个结果吗?数据库的写访问是否for each
负责类似的时间?
以下是推荐阅读:
vb.net - VB.NET 4.0 Parallel.ForEach AddressOf 多个值?
我正在尝试从 Delegates 更改为 Parallel.ForEach
我看到下面的工作正常。
但是,如果我的 Sub 需要多个变量怎么办?你能告诉我我应该怎么做下面的事情吗?
谢谢
c# - 使用 Parallel Linq Extensions 合并两个序列,如何首先产生最快的结果?
假设我有两个返回整数 1 到 5 的序列。
第一个返回 1、2 和 3 非常快,但 4 和 5 每个需要 200 毫秒。
第二个以 200 毫秒的延迟返回 1、2 和 3,但快速返回 4 和 5。
联合这两个序列给我的只是数字 1 到 5。
我不能保证这两种方法中的哪一种在什么时候有延迟,所以执行的顺序不能保证我的解决方案。因此,我想并行化联合,以最大限度地减少我的示例中的(人为)延迟。
一个真实的场景:我有一个返回一些实体的缓存和一个返回所有实体的数据源。我希望能够从内部并行化对缓存和数据源的请求的方法返回一个迭代器,以便缓存结果尽可能快地产生。
注 1:我意识到这仍然在浪费 CPU 周期;我不是在问如何防止序列迭代它们的慢元素,而是问我如何尽可能快地合并它们。
更新 1:我已经定制了 achitaka-san 的出色响应以接受多个生产者,并使用 ContinueWhenAll 设置 BlockingCollection 的 CompleteAdding 一次。我只是把它放在这里,因为它会因为缺少评论格式而丢失。任何进一步的反馈都会很棒!
.net - TransactionScope 不能与并行扩展一起使用?
如果我执行以下操作:
TransactionScope 不起作用。如果我在 scope.complete 上设置断点,则没有事务处于活动状态并且更新已经完成。
如果我将其更改为:
一切都按预期工作。任何人都知道为什么并行版本不能正常工作?