/// <summary> /// Callback do zdarzenia gdy statusy zostają zaktualizowane /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void BlpComStatusesUpdated(object sender, StatusesLoadingEventArgs e) { IList<StatusViewModel> sts = ViewModelHelper.MapToViewStatus(e.Statuses, blipfaceUser.UserName); lock (lockLastStatus) { //pierwszy status jest najnowszy if(sts.Count>0) newestStatus = sts[0]; } //RetriveBlipHyperlinks(sts); //blokujemy kolejką gdy dodajemy do niej nowe statusy, lock (lockQueue) { //dodajemy statusy od końca for (int i = sts.Count - 1; i >= 0; i--) { statusQueue.Enqueue(sts[i]); } //foreach (var st in sts) //{ // statusQueue.Enqueue(st); //} } //pobierz z kolejki dodane wyżej statusu i przetworz je AddStatusesWithHyperlinks(true); //foreach (var st in sts) //{ // RetriveStatusHyperlinks(st); //} //view.UpdateStatuses(sts); //view.Statuses = statuses.Concat(view.Statuses).ToList(); view.ConnectivityStatus = SetConnectivityStatus(ConnectivityStatus.Online); // view.Statuses.Insert(0, statuses[0]); updateStatusTimer.Start(); }
/// <summary> /// Callback do zdarzenia gdy statusy zostają zaktualizowane /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void BlpComStatusesUpdated(object sender, StatusesLoadingEventArgs e) { if (e.Statuses.Count < 1) return; try { lock (lockLastStatus) { //jeżeli pobrało jakieś statusu i pierwszy(najnowszy) ma id większe //od dotychczaoswego to przypisz if (newestStatusId == 0 || (e.Statuses[0].Id > newestStatusId)) { newestStatusId = e.Statuses[0].Id; } else { //jeżeli nie ma statusów lub najnowszy pobrany status ma id mniejsze //to można przerwać przetwarzanie gdyż one już są return; } } IList<StatusViewModel> sts = ViewModelHelper.MapToViewStatus(e.Statuses, blipfaceUser.UserName); //blokujemy kolejką gdy dodajemy do niej nowe statusy, EnqueueStatuses(sts); //pobierz z kolejki dodane wyżej statusu i przetworz je //AddStatusesWithHyperlinks(true); view.ConnectivityStatus = SetConnectivityStatus(ConnectivityStatus.Online); //view.Error = // view.Statuses.Insert(0, statuses[0]); //updateStatusTimer.Start(); } catch (Exception exp) { view.Error = exp; } }
/// <summary> /// calback do zdarzenia gdy statusy zostają załadowane od nowa /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void BlpComStatusesLoaded(object sender, StatusesLoadingEventArgs e) { //view.Statuses = IList<StatusViewModel> sts = ViewModelHelper.MapToViewStatus(e.Statuses, blipfaceUser.UserName); lock (lockLastStatus) { //pierwszy status jest najnowszy if (sts.Count > 0) { newestStatus = sts[0]; //informacja że załadowano statusy statusesLoaded = true; } } lock (lockQueue) { //tu nie musimy odwracać bo i tak dodajemy na koniec statusy //dodajemy do kolejki od razu, lecz od drugiego statusu dopiero, pierwszy o indeksie 0 //w celu złudzenia przyspieszenia dodajemy od razu for (int i = 1; i < sts.Count; i++) { statusQueue.Enqueue(sts[i]); } //foreach (var st in sts) //{ // statusQueue.Enqueue(st); //} } //jak najszybciej ustawiamy pierwszy status na liście, aby użytkownik nie czekał //aż zostaną przetworzone wszystkie statusy var oneStatusList = new ObservableCollection<StatusViewModel>(); StatusViewModel initStatus = sts[0]; RetriveStatusHyperlinks(initStatus); oneStatusList.Add(initStatus); //inicjujemy listę statusów tylko jednym statusem, pozostałe będą dodawanie //kolejno view.Statuses = oneStatusList; //chyba to już nie potrzebne będzie //sts.RemoveAt(0); //parametr false - dodajemy na koniec statusy AddStatusesWithHyperlinks(false); //view.Statuses = new List<StatusViewModel>(sts); view.ConnectivityStatus = SetConnectivityStatus(ConnectivityStatus.Online); //uruchamiamy z normalnym czasem timer StartListeningForUpdates(UpdateTime); }
/// <summary> /// calback do zdarzenia gdy statusy zostają załadowane od nowa /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void BlpComStatusesLoaded(object sender, StatusesLoadingEventArgs e) { try { lock (lockUpdateQueue) { statusUpdateQueue.Clear(); } if (e.Statuses.Count > 0) { lock (lockLastStatus) { //ładujemy statusy od nowa więc, nie ma co sprawdzać //od razu przypisujemy najnowszy status newestStatusId = e.Statuses[0].Id; } //informacja że załadowano statusy statusesLoaded = true; if (consumeStatusesThread != null) { //consumeStatusesThread.IsAlive; //przerywamy wątek consumeStatusesThread.Abort(); } IList<StatusViewModel> sts = ViewModelHelper.MapToViewStatus(e.Statuses, blipfaceUser.UserName); //EnqueueStatuses(sts, QueueKind.LoadsQueue); consumeStatusesThread = new Thread(new ParameterizedThreadStart(ConsumeLoads)); consumeStatusesThread.Name = "BlipFace consume Loaded Statuses"; consumeStatusesThread.IsBackground = true; consumeStatusesThread.Start(sts); //ThreadPool.QueueUserWorkItem(c => ConsumeLoads()); /* //ostatni ststus StatusViewModel initStatus = sts[0]; sts.RemoveAt(0); //jak najszybciej ustawiamy status na liście, aby użytkownik nie czekał //aż zostaną przetworzone wszystkie statusy var oneStatusList = new ObservableCollection<StatusViewModel>(); RetriveStatusHyperlinks(initStatus); oneStatusList.Add(initStatus); //inicjujemy listę statusów tylko jednym statusem, pozostałe będą dodawanie if (view.Statuses != null) view.Statuses = null; view.Statuses = oneStatusList; for (int i = 0; i < sts.Count; i++) { if (view.Statuses != null) { RetriveStatusHyperlinks(sts[i]); view.AddStatus(sts[i], false); } else { //wyjdź z metody statusesLoaded = false; return; } } */ //view.Statuses = new List<StatusViewModel>(sts); view.ConnectivityStatus = SetConnectivityStatus(ConnectivityStatus.Online); } } catch (Exception exeption) { view.Error = exeption; } if (mode != UpdateMode.Archive) { ThreadPool.QueueUserWorkItem(c => ConsumeStatuses()); //co by się nie działo to trzeba to uruchomić uruchamiamy wątek z przetważaniem statusów //consumeStatusesThread =new Thread(ConsumeStatuses); //consumeStatusesThread.Name = "BlipFace consume Statuses"; //consumeStatusesThread.IsBackground = true; //consumeStatusesThread.Start(); //uruchamiamy z normalnym czasem timer StartListeningForUpdates(refreshTimeSec); } }