Beispiel #1
0
        /// <summary>
        /// Подписаться на рассылку новостей по указанной тематике.
        /// </summary>
        /// <param name="category">Тема рассылки</param>
        public bool Subscribe(string category)
        {
            INewsServiceCallback subscriber = OperationContext.Current.GetCallbackChannel <INewsServiceCallback>();
            bool hasCategory = RssService.GetArticles(category).Count > 0;

            if (hasCategory)
            {
                Dictionary <string, int> subCategories = subscribers.GetOrAdd(subscriber, new Dictionary <string, int>());
                subCategories.Add(category, 0);
            }
            Log.SubscribeInfo(subscriber.GetHashCode(), category, hasCategory);
            return(hasCategory);
        }
Beispiel #2
0
        private void mailing()
        {
            while (!cancellationMailing.Token.IsCancellationRequested)
            {
                List <Tuple <INewsServiceCallback, string> > info = new List <Tuple <INewsServiceCallback, string> >();

                // Проход по всем клиентам
                foreach (KeyValuePair <INewsServiceCallback, Dictionary <string, int> > sub in subscribers)
                {
                    // Проход по всем подпискам клиента
                    foreach (KeyValuePair <string, int> subInfo in sub.Value)
                    {
                        List <Article> articles = RssService.GetArticles(subInfo.Key);
                        if (articles.Count > 0 && articles.Count > subInfo.Value)
                        {
                            // Пытаемся отправить пользователю статью
                            try
                            {
                                sub.Key.SendArticle(articles[subInfo.Value]);
                                Log.MailingInfo(sub.Key.GetHashCode(), subInfo.Key, true);
                                info.Add(new Tuple <INewsServiceCallback, string>(sub.Key, subInfo.Key));
                            }
                            catch (TimeoutException e)
                            {
                                Log.MailingInfo(sub.Key.GetHashCode(), subInfo.Key, false);
                                // Удаляем пользователя из рассылки
                                subscribers.TryRemove(sub.Key, out Dictionary <string, int> s);
                            }
                            catch (Exception e)
                            {
                                Console.WriteLine("Необработаная ошибка " + e.GetType().ToString() + " " + e.Message);
                            }
                        }
                    }
                }

                foreach (Tuple <INewsServiceCallback, string> i in info)
                {
                    subscribers[i.Item1][i.Item2]++;
                }

                mailingTask.Wait(delayMailing);
            }
        }