с помощью реактивной 4.2.0 я могу сканировать счетчик внутри Подписаться - PullRequest
0 голосов
/ 18 марта 2020

Можно ли получить доступ к родительской коллекции внутри подписки, чтобы выполнить сканирование для подсчета? Должен ли я просто запустить обработчик событий длиной менее миллисекунды, чтобы включить мой обработчик сообщений WPF, прерывания WIFI и все остальное, чтобы многопоточно обновлять счетчик сборов, когда никто даже не использует мышь?

var MouseXCentiPixels =
Observable.FromEventPattern<MouseButtonEventArgs>(
target: this, 
eventName: nameof(System.Windows.Window.MouseDown))
.Select(_evt => _evt.EventArgs.GetPosition(relativeTo: this).X * 1.0E2)


MouseXCentiPixels
.Throttle(dueTime: TimeSpan.FromMilliseconds(6E1))
.Subscribe(onNext: (_MX) =>
{
    Task<Int32> GetCountQuickly = Task.Run<Int32>(async () =>
    {
    Int32 result1 = await MouseXCentiPixels.Scan(
    seed: 0, 
    accumulator: (CurrentAccumulation, CurrentItem) => 
        {
            var T = CurrentAccumulation; var P = CurrentItem;
            return 1;
        }
    }
    Int32 MultiThreadedQuickCount = GetCountQuickly.Wait(timeout: TimeSpan.FromMilliseconds(1E2));
}

);

1 Ответ

0 голосов
/ 22 марта 2020

Хорошо, я полагаю, что реактивная система занята тем, что все сканирует всякий раз, когда вы сканируете, вот так:

TimeSpan SampleTimeSpan = TimeSpan.FromSeconds(.50E0);

MouseXCentiPixels
.Select(_mousex => -1)
.Scan((accum, curr) => ++accum)
.Sample(interval: SampleTimeSpan)
.Buffer(count: 2, skip: 1)
.Select(bufGroupOfTwo => bufGroupOfTwo.Skip(1).FirstOrDefault() - bufGroupOfTwo.FirstOrDefault() )
.Subscribe(AccumulatedClickChangeDuringInterval =>
{
    Double ClicksPerSecond = AccumulatedClickChangeDuringInterval /    SampleTimeSpan.TotalSeconds;
    Double SecondsPerMinute = 60;
    Double ClicksPerMinute = ClicksPerSecond * SecondsPerMinute;

    Debug.WriteLine($" {nameof(ClicksPerMinute)} : {ClicksPerMinute:N1}");
});
...