/// <summary>
        ///		SpacomicMainViewModelクラスの新しいインスタンスを生成します。
        /// </summary>
        public SpacomicMainViewModel()
        {
            // AppオブジェクトからModelを取得します。
            spacomicRSSCollectionModel = (App.Current as App)?.SpacomicRSSCollectionModel;

            // Modelの参照の取得に失敗したら、例外をスローします。
            if (spacomicRSSCollectionModel == null)
            {
                throw new Exception($"Failed to get reference of Model's instance on {GetType().ToString()}");
            }

            // プロパティの変更を通知します。
            spacomicRSSCollectionModel.PropertyChanged +=
                (sender, e) =>
                PropertyChanged?.Invoke(sender, e);

            // RSSフィードの取得が完了したことをView側に通知します。
            spacomicRSSCollectionModel.GetRSSCompleted +=
                (sender, e) => {
                // RSSフィード取得中のフラグをオフにします。
                IsProgress = false;
                NotifyPropertyChanged(nameof(CanSwitchComicView));
                // RSSフィード取得完了したことをView側に通知します。
                GetRSSCompleted?.Invoke(this, e);
            };

            // すぱこーRSSフィードの最新話が見つかったことを通知します。
            spacomicRSSCollectionModel.NewRSSContentsFound +=
                (sender, e) =>
                NewRSSContentsFound?.Invoke(sender, e);
        }
Beispiel #2
0
        /// <summary>
        ///		すぱこーRSSフィードの新しい話がWeb上にあるかどうか判別します。
        /// </summary>
        private async Task CheckNewContents()
        {
            // 最新話が見つかったフラグ
            bool newContentsFound = false;

            try {
                foreach (var sause in spacoSause)
                {
                    string url = $"{sause.RSSFeedURL}?count=1";
                    // このforeachブロック専用のCancellationTokenを生成します。
                    using (CancellationTokenSource cancellationTokenSourceInstant = new CancellationTokenSource()) {
                        // タイムアウトは5秒間に設定します。
                        cancellationTokenSourceInstant.CancelAfter(5000);
                        using (XmlReader reader = await Task.Run(() => SpacoRSSClient.GetXmlReaderAsync(url, cancellationTokenSourceInstant.Token))) {
                            SpacoRSSReader srr = await Task.Run(() => SpacoRSSReader.LoadAsync(reader, cancellationTokenSourceInstant.Token));

                            // 最新話のVolumeが、Items上の同じソースの最新のVolumeより大きい時、フラグをオンにします。
                            if (srr.Items.First().Volume > Items.Where(_ => _.Type == sause.Type).Max(_ => _.Volume))
                            {
                                newContentsFound = true;
                            }
                        }
                    }
                }
                // 最新話が見つかったら、ViewModelに通知します。
                if (newContentsFound)
                {
                    NewRSSContentsFound?.Invoke(this, new EventArgs());
                }
            }
            catch (Exception) {}
        }