我有一个基于MSMQ的位置应用程序,我从现场的单位接收位置更新,然后处理它们并将它们放入数据库.
更新过程没有DB之外的依赖项,因此我的应用程序可以配置可变数量的线程.因为我希望这个过程在失败的情况下是健壮的,我想尽可能多地处理消息,但不是更多(所以如果系统出现故障,我可以选择离开的地方).
我有正确的应用程序工作,但我已经看到,如果我提高我用来处理消息的线程数,我的平均消息数量是一个级别(我使用性能计数器来衡量这个),我得到了系统比如,利用可用CPU时间的50%(我有一个Core i7 820QM,带有4个物理内核和8个逻辑内核),但如果我不是提高线程,启动相同数量的进程,我会使用100占CPU时间的百分比,并获得更高数量的平均事件处理.
这可能是锁争用问题吗?与Windows 7处理超线程处理器的方式有什么关系?我希望了解问题的本质,任何指针都会非常感激.
注意:我在这个项目中使用MSMQ,Rx和Entity Framework.
我有这个代码:
var s1 = new Subject<Unit>();
var s2 = new Subject<Unit>();
var ss = s1.Merge(s2).Finally(() => Console.WriteLine("Finished!"));
ss.Subscribe(_ => Console.WriteLine("Next"));
s1.OnNext(new Unit());
s2.OnNext(new Unit());
s1.OnCompleted(); // I wish ss finished here.
s2.OnCompleted(); // Yet it does so here. =(
Run Code Online (Sandbox Code Playgroud)
我已经使用OnError(new OperationCanceledException())解决了我的问题,但我想要一个更好的解决方案(必须有一个组合器吗?).
升级到DotNet 4.5后,一个查询开始给我OutOfMemoryExceptions.
(提炼)查询是:
var tests = new int[]{}
.AsParallel()
.GroupBy(_ => _)
.Take(int.MaxValue)
.ToArray();
Run Code Online (Sandbox Code Playgroud)
我发布这个给同样问题的人.我将在下面回答.