问题标签 [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.
c# - 任务并行库中的 BlockingCollection 不会自动释放底层实例的引用
我使用 aBlockingCollection
在 C# 4.0 中实现生产者-消费者模式。
BlockingCollection
存放占用大量内存的项目。我想让生产者一次从 BlockingCollection 中取出一个项目,然后处理它。
我在想,通过使用 foreach on BlockingCollection.GetConsumingEnumerable()
,每次BlockingCollection
都会从底层队列中删除项目(这意味着所有与引用一起),因此在处理项目的 Process() 方法结束时,项目可能是垃圾集。
但是这是错误的。似乎 foreach 循环BlockingCollection.GetConsumingEnumerable()
确实保存了进入队列的项目的所有引用。在退出 foreach 循环之前,所有项目都被保留(从而防止被垃圾收集)。
我没有使用简单的 foreach 循环 on BlockingCollection.GetConsumingEnumerable()
,而是使用 while 循环测试 BlockingCollection.IsComplete 标志,并在我BlockingCollection.Take()
用来抓取消耗品的循环内。我会假设它BlockingCollection.Take()
具有与 类似的效果List.Remove()
,它将从 BlockingCollection 中删除项目的引用。但这又是错误的。所有项目仅在 while 循环之外进行垃圾收集。
所以我的问题是,我们如何才能轻松实现 BlockingCollection 可能包含消耗内存的项目并且每个项目一旦被消费者消费就可以被垃圾回收的要求?非常感谢您的帮助。
编辑:根据要求,添加了一个简单的演示代码:
输出是所有创建和处理消息,后面是“完成处理”。然后是来自实体的所有销毁消息。创建实体消息显示 Entity.ID 从 0 到 9,销毁消息显示 Entity.ID 从 9 到 0。
编辑:
即使我设置了 BlockingCollection 的绑定容量,所有进入它的项目也只有在循环退出时才会最终确定,这很奇怪。
.net-4.0 - 使用并行 for 循环时索引超出范围异常
我正在尝试执行以下代码,并且在尝试将数组值分配给列表时不断收到 Index out of range 异常:-
我在这里做错了吗?我知道该过程是无序/异步的,但为什么 "i" 得到的值高于 "array.Length" 的值?
.net - 在任务并行库中:如何推迟 Task.TaskFactory.FromAsync 任务执行?
我有一个返回任务的方法,例如:
我想保留对该任务的引用并稍后运行它。但是,似乎由 FromAsync 方法创建的任务是立即执行的。我怎样才能推迟它的执行?
c# - 如果超时没有完成任务,Task.Wait(int) 会停止任务吗?
我有一个任务,我希望它需要不到一秒钟的时间才能运行,但如果它需要的时间超过几秒钟,我想取消该任务。
例如:
请注意,在 3000 毫秒后等待到期。超时后任务被取消还是任务仍在运行?
c#-4.0 - 任务忽略 Thread.Sleep
试图掌握 TPL。
只是为了好玩,我尝试创建一些随机睡眠的任务,以查看它是如何处理的。我的目标是火灾并忘记模式..
但我不明白为什么它将所有行输出到控制台而忽略睡眠(随机)
有人可以向我解释吗?
c# - C# 5.0 的 async-await 特性与 TPL 有何不同?
我看不出 C#(和 VB)的新异步功能和 .NET 4.0 的Task Parallel Library之间有什么不同。以 Eric Lippert的代码为例:
该await
关键字似乎有两个不同的目的。第一次出现 ( FetchAsync
) 似乎意味着“如果稍后在方法中使用此值并且其任务未完成,请等到它完成后再继续。” 第二个实例 ( archive
) 似乎意味着“如果此任务尚未完成,请立即等待它完成。” 如果我错了,请纠正我。
难道就不能这么简单地写成这样吗?
我已将第一个替换await
为Task.Result
实际需要该值的位置,将第二个await
替换Task.Wait()
为实际发生等待的位置。该功能(1)
已经实现,并且(2)
在语义上更接近代码中实际发生的情况。
我确实意识到一个async
方法被重写为状态机,类似于迭代器,但我也看不到它带来了什么好处。任何需要另一个线程来操作的代码(例如下载)仍然需要另一个线程,并且任何不需要的代码(例如从文件中读取)仍然可以利用 TPL 仅与单个线程一起工作。
我显然在这里遗漏了一些巨大的东西。任何人都可以帮助我更好地理解这一点吗?
c# - 使用 .NET 4.0 任务并行库强制执行任务顺序
我有一个程序,它有大量传感器以相当高的速率产生数据,以及需要使用它的消费者。消费者以非常不同的价格消费。
由于我使用的是 IObserver/IObservable,因此简单的解决方案是简单地为每个事件创建一个任务,并将 OnNext() 调用和数据包装在 lamda 中。这非常有效,我很惊讶原始调用的开销如此之小。
问题是这些消费者中的一些需要严格执行事件的顺序,并且不能错过任何事件。“PerferFairness”还不够好。
我想出的最佳解决方案不是包装 event/OnNext() 对,而是将 Insert 包装到 ParallelQueue 中,每个消费者一个队列,并在队列的另一端有一个线程来制作 OnNext()来电。
这种方法的三个直接问题。它比 Task/OnNext() 包装解决方案慢得多。ParallelQueue 没有阻塞出列(或者有吗?),所以实现有点棘手。第三,这似乎是一个常见的问题,我无法想象没有某种方法可以强制执行我错过的命令,也许就像多个任务工厂共享一个底层池,每个工厂都有一些设置,使它们严格执行命令。
任何人都知道实现我想要做的事情的正确方法吗?
编辑:任何涉及每个消费者或生产者线程的解决方案都不起作用。生产者/消费者形成长链,每条链有数百个。
multithreading - 创建 .Net 4.0 并行任务时检查空闲内核的数量
我的问题可能听起来有点天真,但我对多线程编程很陌生。
我正在编写一个处理传入外部数据的应用程序。对于每个到达的数据,一个新任务按以下方式创建:
数据项到达速度非常快(每秒、半秒等),因此创建了很多任务。处理每项任务可能需要大约一分钟。在测试它时,我看到线程数一直在增加。如何限制创建的任务数量,使实际工作线程的数量稳定高效。我的电脑只有双核。
谢谢!
.net - 如何添加任务优先级功能
我将任务库用于我的图像压缩服务。我会压缩许多文件并发。但我希望服务仅在用户空闲时运行(或程序中不再有重要的任务)。
我知道 threadPool 不支持“更改线程优先级”功能,所以任务也支持此功能。
我可以在更高级别的控制上开发该功能吗?(例如 TaskScheduler 优先级)
unix - ThreadLocal 聚合和任务并行库
为什么我在以下代码段中得到不同的结果
代码示例 1
样品 2