Windows phone 7 油门操作导致window phone 7性能下降

Windows phone 7 油门操作导致window phone 7性能下降,windows-phone-7,system.reactive,reactive-programming,Windows Phone 7,System.reactive,Reactive Programming,我正在构建一个大量使用RX的WP7应用程序,我遇到了一个问题。当添加值大于20 ms的油门时,会显著降低性能 下面的片段指出了问题所在: var moveObs = Observable.FromEventPattern<MouseEventHandler, MouseEventArgs>( h => this.MouseMove += h, h => this.MouseMove -= h)

我正在构建一个大量使用RX的WP7应用程序,我遇到了一个问题。当添加值大于20 ms的油门时,会显著降低性能

下面的片段指出了问题所在:

var moveObs = Observable.FromEventPattern<MouseEventHandler, MouseEventArgs>(
                    h => this.MouseMove += h,
                    h => this.MouseMove -= h);

// Observe dragging
var yObs = (from x in moveObs
            select -(x.EventArgs.GetPosition(this).Y - _initY));

var result = yObs.SkipWhile(y => !_isDragging)
                 .Throttle(TimeSpan.FromMilliseconds(33));

result.TimeInterval()
      .Subscribe(x => Debug.WriteLine("Mouse move interval: " + x));
'UI Task' (Managed): Loaded 'Microsoft.Devices.Sensors.dll'
The thread '<No Name>' (0x1e18) has exited with code 0 (0x0).
Mouse move interval: 80@00:00:04.1920000
Mouse move interval: -160@00:00:00.2900000
Mouse move interval: -126@00:00:00.6710000
The thread '<No Name>' (0x22a4) has exited with code 0 (0x0).
Mouse move interval: -90@00:00:01.0460000
The thread '<No Name>' (0x2514) has exited with code 0 (0x0).
Mouse move interval: -113@00:00:00.3250000
The thread '<No Name>' (0x270c) has exited with code 0 (0x0).
Mouse move interval: 108@00:00:12.1420000
The thread '<No Name>' (0x186c) has exited with code 0 (0x0).
Mouse move interval: 221@00:00:01.4860000
var oneNumberPerSecond = Observable.Interval(TimeSpan.FromMilliseconds(10));

var lowNums = from n in oneNumberPerSecond
              select n;


lowNums.Throttle(TimeSpan.FromMilliseconds(100))
       .TimeInterval()
       .Subscribe(lowNum => Debug.WriteLine(lowNum));

据我所知,这应该每100毫秒打印一个数字,但它不打印任何数字

这并不是说它慢-你所描述的正是油门的行为

当流在指定的持续时间内停止生成值时,节流阀生成值

让我把你的责备说清楚:

var oneNumberPerSecond = Observable.Interval(TimeSpan.FromMilliseconds(10));
这是一个冷观测值,每10毫秒产生一个值

var lowNums = from n in oneNumberPerSecond
              select n;
这真的没什么用。它相当于
onenumbersecond.Select(i=>i)


这将产生一个流,每当
lowNums
停止产生100毫秒的值时,该流将产生一个值。但由于
lowNums
每10毫秒产生一个值,所以100毫秒内不会有任何事情发生。

我可能会补充说
Throttle
并不是这个方法的最佳名称。你完全正确,我把它和示例混在了一起。但事实上,性能问题仍然存在,我认为这与我现在遇到的问题非常相似:@Asti-BTW,
Interval
产生冷的可观测值,而不是热的。@Vitalij BTW,如果你在寻找忽略突发的东西,
Sample
不是正确的解决方案。@Vitalij不确定你到底想要什么-在你的例子中,您希望在用户停止拖动一段时间时收到通知,还是希望在用户开始拖动但跳过输入过快的值时收到通知(突发情况)?
lowNums.Throttle(TimeSpan.FromMilliseconds(100))