- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有几个无限生成器方法,包括一些长时间运行和无限长时间运行的生成器。
IEnumerable<T> ExampleOne() {
while(true) // this one blocks for a few seconds at a time
yield return LongRunningFunction();
}
IEnumerable<T> ExampleTwo() {
while(true) //this one blocks for a really long time
yield return OtherLongRunningFunction();
}
我的目标是拥有一个组合两个示例中的项目的无限序列。这是我使用 PLINQ 尝试过的:
IEnumerable<T> combined = new[] { ExampleOne(), ExampleTwo() }
.AsParallel()
.WithMergeOptions(ParallelMergeOptions.NotBuffered)
.WithExecutionMode(ParallelExecutionMode.ForceParallelism)
.SelectMany(source => source.GetRequests());
这似乎将两个 IEnumerables 适本地组合成一个新的,来自 IEnumerable
#1 和 #2 的项目只要出现在两个源 IEnumerables
中的任何一个中就可用:
//assuming ExampleTwo yields TWO but happens roughly 5 times
//less often then ExampleOne
Example output: one one one one one TWO one one one one one one TWO
但是,似乎有时(通常在运行许多小时之后)OtherLongRunningFunction()
会在很长一段时间内不返回,并且在以下条件下难以重现,combined
序列将阻塞它,而不是继续从第一个 LongRunningFunction
返回结果。看起来虽然组合并行查询开始使用两个线程,但后来它决定切换到一个线程。
我的第一个想法是“这可能是 RX Observable.Merge
而不是 PLINQ 的工作。”但是我很感激这两个答案,这些答案显示了处理这种情况的正确替代方法,以及关于 PLINQ 如何在查询开始后数小时内更改并行度的机制的解释。
最佳答案
这是 Rx 的方法,事实上,它确实使用了 Merge
:
IObservable<T> LongRunningFunction()
{
return Observable.Start(() => {
// Calculate some stuff
return blah;
}, Scheduler.TaskPoolScheduler);
}
Observable.Merge(
Observable.Defer(LongRunningFunction).Repeat(),
Observable.Defer(OtherLongRunningFunction).Repeat(),
).Subscribe(x => {
Console.WriteLine("An item: {0}", x);
});
关于c# - 尝试在长时间运行的生成器上使用 PLINQ 的陷阱?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8998799/
我有一个独立的 Thread 应用程序。这是一个等待消息的监听器,当消息到达时执行一些操作,其中我必须将消息保存在数据库中。但我遇到了问题,因为如果我运行应用程序并“手动发送消息”,一切都会正常工作,
我有以下php代码: sleep(65); $query = "UPDATE database.table SET XXXXXXX = XXXXXXX - ".$YYYYYY." WHERE
我正在开发一个业余爱好应用程序。它在主布局中使用 webview。单击 webview 内的链接会使用户保持在 webview 内。启动后一切正常,但仍在应用程序内。但是,在手机休眠一段时间后,我重新
我目前运行的应用程序需要最大堆大小为 16GB。 目前我使用以下标志来处理垃圾回收。 -XX\:+UseParNewGC, -XX\:+UseConcMarkSweepGC, -XX:CMSIniti
$ uname -a Darwin Wheelie-Cyberman 10.8.0 Darwin Kernel Version 10.8.0: Tue Jun 7 16:33:36 PDT 2011
在 while 循环仍在休眠时退出它的最简单方法是什么?是否有某种函数可以在 sleep 时检测某个值是否为真? 或者我是否在循环中设置一个小 sleep 并检查如果不再睡一会儿就退出?如果可以,我该
我正在 Ubunu 的 Jetty 6 上运行 Java Web 服务器,用于基于反向 ajax 的 Web。而且我在向浏览器重新发送数据的线程滞后方面遇到了严重的问题。很多时候,一些线程开始 hib
当我运行长时间操作时,我遇到来自 IIS 的请求超时。我的 ASP.NET 应用程序正在后台处理数据,但处理的记录数量很大,因此操作需要很长时间。 但是,我认为 IIS 使 session 超时。这是
我不确定从哪里开始解决这个问题,但如果我有一个 AJAX 网络应用程序向服务器发送请求并在数据库(在我的例子中是 postgresql)上运行长查询,有没有办法停止或如果仍在运行时用户刷新页面或关闭
我是一名优秀的程序员,十分优秀!