示例#1
0
        public static void AssertAreEqual(this IVectorComparer vectorComparer, IVector expected, IVector actual, double delta = 0.0)
        {
            double result = vectorComparer.Compare(expected, actual);

            Assert.AreEqual(result, 0, delta);
        }
示例#2
0
        public MainWindowViewmodel(IPingTimer pingTimer,
                                   IPingService pingService,
                                   IPingCollectionVectorFactory pingCollectionVectorFactory,
                                   IPingVectorFactory pingVectorFactory,
                                   IVectorComparer vectorComparer,
                                   IIpAddressService ipAddressService,
                                   IDispatcherAccessor dispatcherAccessor,
                                   PingStatsUtil pingStatsUtil,
                                   IPingResponseUtil pingResponseUtil)
        {
            _pingTimer   = pingTimer;
            _pingService = pingService;
            _pingCollectionVectorFactory = pingCollectionVectorFactory;
            _pingVectorFactory           = pingVectorFactory;
            _vectorComparer   = vectorComparer;
            _pingStatsUtil    = pingStatsUtil;
            _pingResponseUtil = pingResponseUtil;
            IObservable <long> pingTimerObservable      = _pingTimer.Start(() => false);
            IDisposable        pingResponseSubscription = null;

            _targetDatamodels = new ConcurrentDictionary <IPAddress, PingState>();
            _stats            = new ConcurrentDictionary <IPAddress, PingStats>();
            System.Windows.Threading.Dispatcher d = dispatcherAccessor.GetDispatcher();
            Subject <int> resortSubject           = new Subject <int>();

            ResortObservable = resortSubject;

            ipAddressService.IpAddressObservable.Subscribe(ipAddresses =>
            {
                pingResponseSubscription?.Dispose();
                IObservable <IEnumerable <Task <IPingResponse> > > pingResponseObservable =
                    pingTimerObservable.Select(l => _pingService.Ping(ipAddresses));
                pingResponseSubscription = pingResponseObservable.Subscribe(async pingResponseTasks =>
                {
                    IPingResponse[] responses = await Task.WhenAll(pingResponseTasks);
                    IVector[] vectors         = responses.Select(pingResponse =>
                    {
                        IPingStats stats   = GetUpdatedStats(pingResponse);
                        IVector pingVector = _pingVectorFactory.GetVector(pingResponse, stats);
                        if (_targetDatamodels.TryGetValue(pingResponse.TargetIpAddress, out PingState pingState))
                        {
                            TargetDatamodel targetDatamodelX = pingState.TargetDatamodel;
                            targetDatamodelX.RoundTripTime   = pingResponse.RoundTripTime;
                            targetDatamodelX.StatusSuccess   = GetStatusSuccess(pingResponse.Status);
                            IVector boring = _pingVectorFactory.GetVector(new PingResponse(IPAddress.Loopback, TimeSpan.Zero, IPStatus.DestinationHostUnreachable, IPAddress.Loopback),
                                                                          new PingStats(DateTime.Now.AddDays(-1), DateTime.Now)
                            {
                                Average25 = 0, Average25Count = 25, StatusHistory = new bool[PingStatsUtil.MaxHistoryCount]
                            });
                            double change           = _vectorComparer.Compare(boring, pingVector);
                            targetDatamodelX.Change = change;

                            if (targetDatamodelX.Change > 0.008)
                            {
                                targetDatamodelX.ShowUntil = DateTime.Now.Add(TimeToShowOddTargets);
                            }

                            if (targetDatamodelX.ShowUntil <= DateTime.Now)
                            {
                                targetDatamodelX.ShowUntil = null;
                            }

                            pingState.Previous = pingVector;
                        }
                        else
                        {
                            TargetDatamodel targetDatamodel = new TargetDatamodel(address: pingResponse.TargetIpAddress,
                                                                                  statusSuccess: GetStatusSuccess(pingResponse.Status),
                                                                                  roundTripTime: pingResponse.RoundTripTime);
                            _targetDatamodels.Add(pingResponse.TargetIpAddress, new PingState {
                                TargetDatamodel = targetDatamodel, Previous = pingVector
                            });
                            d.Invoke(() => TargetDatamodels.Add(targetDatamodel));
                        }

                        return(pingVector);
                    }).ToArray();
                    resortSubject.OnNext(0);
                });
            });

            TargetDatamodels = new ObservableCollection <TargetDatamodel>();
        }