问题标签 [task-parallel-library]

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 回答
801 浏览

c# - 可以跨 AppDomain 使用 CancellationTokens

.NET 4 引入了一些类型来很好地支持协作取消。我希望能够取消在不同 AppDomain 中运行的操作。CancellationToken类型是一个结构。如果我将它传递给另一个 AppDomain,它会正常工作吗?

0 投票
1 回答
453 浏览

.net-4.0 - 任务并行库如何在终端服务器或 Web 应用程序中扩展?

我知道当我执行诸如 Parallel.For 和类似构造之类的事情时,TPL 对其任务使用了工作窃取队列。

如果我理解正确,该构造将启动许多任务,每个任务都将开始处理项目。如果其中一项任务完成了分配的项目,它将开始从尚未完成的其他任务中窃取项目。这解决了项目 1-100 处理成本低而项目 101-200 成本高的问题,并且这两个任务中的一个将闲置直到另一个完成。(我知道这是一个简化的解释。)

但是,这将如何在终端服务器或 Web 应用程序中扩展(假设我们在将在 Web 应用程序中运行的代码中使用 TPL)?我们是否可以仅仅因为我们的应用程序的 N 个实例并排运行而冒着使 CPU 饱和的风险?

我应该阅读有关此主题的任何信息吗?我还没有找到任何特别的东西,但这并不意味着没有。

0 投票
2 回答
11313 浏览

c# - .NET Task 实例可以在运行期间超出范围吗?

如果我在方法中有以下代码块(使用 .NET 4 和任务并行库):

并且方法返回,该任务会超出范围并被垃圾收集,还是会运行完成?我没有注意到 GCing 有任何问题,但我想确保我没有为 GC 设置竞争条件。

0 投票
1 回答
1438 浏览

asynchronous - 使用任务并行库进行异步 I/O 的建议

BeginRead我有一些使用异步编程模型 (APM) 习惯用法(例如/ )在 C# 中编写的高性能文件传输代码EndRead。此代码从本地磁盘读取文件并将其写入套接字。

为了在现代硬件上获得最佳性能,尽可能保持多个出色的 I/O 操作处于运行状态非常重要。因此,我BeginRead在文件上发布了几个操作,然后当一个完成时,我BeginSend在套接字上调用 a ,当完成时我BeginRead在文件上执行另一个操作。细节比这要复杂一些,但在高层次上就是这样。

我已经让基于 APM 的代码正常工作,但是很难理解并且可能存在细微的并发错误。我很乐意为此使用 TPL。我想Task.Factory.FromAsync会做,但有一个问题。

我见过的所有 I/O 示例(尤其是StreamExtensionsParallel Extensions Extras 中的类)都假设先读后写。这不会按我需要的方式执行。

我不能使用简单Parallel.ForEach的东西或 Extras 扩展Task.Factory.Iterate,因为异步 I/O 任务不会在工作线程上花费太多时间,因此 Parallel 只是启动另一个任务,从而可能导致数十或数百个待处理的 I/O 操作; 太多了!您可以通过Wait处理您的任务来解决这个问题,但这会导致创建一个事件句柄(一个内核对象),并在一个任务等待句柄上阻塞等待,这会占用一个工作线程。我的基于 APM 的实现避免了这两件事。

我一直在尝试不同的方法来保持多个读/写操作在运行中,并且我已经设法使用调用创建另一个任务的方法的延续来做到这一点,但感觉很尴尬,而且绝对不喜欢惯用的 TPL。

有没有其他人在 TPL 上遇到过这样的问题?有什么建议么?

0 投票
1 回答
814 浏览

c# - Parallel ForEach 内部对象的模拟断言?

知道如何在通过闭包在 Parallel.ForEach 中访问模拟对象时调用它吗?我假设因为每次调用都在不同的线程上,Rhino Mocks 会丢失对象的跟踪?

伪代码:

这个测试将返回一个期望违例,期望存根被调用 5 次,但实际上被调用了 0 次。

有什么想法可以告诉 lambdas 跟踪线程本地存根对象吗?

0 投票
1 回答
1311 浏览

c# - 尝试在所有 Linq 查询中使用 Plinq 是否可以?

我读到如果发现 PLinq 更昂贵,PLinq 将自动使用非并行 Linq。所以我想为什么不对所有事情都使用 PLinq(如果可能的话),让运行时决定使用哪一个。

这些应用程序将部署到多核服务器,我可以开发更多代码来处理并行性。

使用 plinq 作为默认设置有哪些陷阱?

0 投票
3 回答
328 浏览

random - 并行循环和随机产生奇怪的结果

我刚开始玩任务并行库,遇到了一些有趣的问题;我对正在发生的事情有一个大致的了解,但想听听比我更有能力的人的评论,以帮助了解正在发生的事情。对于有点冗长的代码,我深表歉意。

我从随机游走的非并行模拟开始:

然后我在并行循环中写了我的第一次尝试:

当我在设置为仅使用 1 个核心的虚拟机上运行它时,我观察到类似的持续时间,但运行不再按顺序处理 - 不足为奇。

当我在双核机器上运行它时,事情变得很奇怪。我在时间上没有看到任何改进,并且每次运行都观察到一些非常奇怪的结果。大多数运行的结果是 -1,000,000(或非常接近),这表明 Random.Next 始终返回 0 准。

当我对每个循环进行随机本地化时,一切正常,并且我得到了预期的持续时间改进:

我的猜测是,问题与 Random 对象在循环之间共享并具有某种状态的事实有关。我认为“并行失败”版本的持续时间缺乏改进是因为对 Random 的调用没有并行处理(即使我看到并行版本使用两个内核,而原始版本没有) . 我真的不明白为什么模拟结果是这样的。

我有一个单独的担忧是,如果我在每个循环本地使用 Random 实例,我可能会遇到多个循环从同一个种子开始的问题(当你生成多个 Random 的时间太接近时会出现问题,导致相同的序列)。

对正在发生的事情的任何见解对我来说都是非常有价值的!

0 投票
2 回答
519 浏览

c# - 我的 GetEnumerator 会导致死锁吗?

我开始编写我的第一个并行应用程序。该分区器将一次枚举来自数据源的IDataReader拉取chunkSize记录。

TLDR;版本

完整代码

我希望IEnumerable它传回的对象是线程安全的(MSDN 示例是这样我假设 PLINQ 和 TPL 可能需要它)_ChunkLock靠近底部的锁定将有助于提供线程安全还是会导致死锁?从文档中我无法判断是否会在yeld return.

此外,如果.net 有内置功能可以做我想做的事情,我更愿意使用它。如果您发现代码有任何其他问题,我将不胜感激。

0 投票
4 回答
646 浏览

.net-4.0 - 使用并行任务库时“foreach”失败

以下代码创建了正确数量的文件,但每个文件都包含第一个列表的内容。谁能发现我做错了什么?

0 投票
6 回答
929 浏览

.net - 在.NET 中内置后台调度系统?

我问虽然我怀疑有任何这样的系统。

基本上我需要安排任务在未来某个时间点执行(通常不超过几秒钟或几分钟后),并且有某种方式取消该请求,除非为时已晚。

IE。看起来像这样的代码:

.NET 中有这样的系统吗?TPL 中有什么可以帮助我的吗?

我需要在这里从系统中的各种实例运行这样的未来动作,并且宁愿避免每个这样的类实例都有自己的线程并处理这个问题。

另请注意,我不想要这个(或类似的,例如通过任务):

可能会有一些这样的任务要执行,它们不需要以任何特定的顺序执行,除非接近他们的截止日期,并且它们具有像实时性能概念这样的东西并不重要。我只是想避免为每个此类操作启动一个单独的线程。