Exemplo n.º 1
0
        private async void ReadFeedsBackground()
        {
            await Task.Run(async() =>
            {
                try
                {
                    lock ("activation")
                    {
                        if (isReaderActive)
                        {
                            return;
                        }
                        isReaderActive = true;
                    }

                    LogInformationSafe("Background RSS reader: Start reading RSS sources");

                    foreach (var feed in feeds)
                    {
                        WebClient webClient = new WebClient();
                        var xml             = webClient.DownloadString(feed);
                        XDocument doc       = XDocument.Parse(xml);
                        Dictionary <string, (RepeatedField <string>, string)> send =
                            new Dictionary <string, (RepeatedField <string>, string)>();

                        var items = from xe in doc
                                    .Element("rss")
                                    .Element("channel")
                                    .Elements("item")
                                    where xe
                                    .Elements("category")
                                    .Count() > 0
                                    select xe;

                        foreach (var item in items)
                        {
                            string k = item.Element("guid").Value;

                            //lock db usage
                            await _locker.LockAsync(async() =>
                            {
                                if (!await _rssManager.HasRss(k))
                                {
                                    string ds = item.Element("pubDate").Value;
                                    DateTime pubDate;
                                    if (!DateTime.TryParse(ds,
                                                           CultureInfo.InvariantCulture,
                                                           DateTimeStyles.None,
                                                           out pubDate))
                                    {
                                        pubDate = DateTime.Now;
                                    }

                                    var tags  = item.Elements("category");
                                    var rssId = await _rssManager.CreateRss(k, item.ToString(), pubDate);

                                    foreach (var tag in tags)
                                    {
                                        await _rssManager.RssAddTag(rssId, tag.Value);
                                    }
                                }
                            });
                        }
                    }
                    Thread.Sleep(1000 * 300);
                }
                catch (Exception ex)
                {
                    _logger.LogError("Background RSS reader: " + ex.ToString());
                    Thread.Sleep(10000);
                }
            });

            lock ("activation")
            {
                isReaderActive = false;
            }

            //restart
            ReadFeedsBackground();
        }