Exemple #1
0
        static async Task Main(string[] args)
        {
            Directory.CreateDirectory(basePath);
            var bags      = new SyncQueue <Dictionary <string, int> >();
            var resultBag = new Dictionary <string, int>();
            var logger    = new FileLogger();

            logger.LogMessage("Starting Async/Await test");

            var timer = new Timer((a) => // Consumer
            {
                logger.LogMessage($"Timer Check");
                if (bags.TryGetItem(out var bag))
                {
                    foreach (var word in bag)
                    {
                        if (resultBag.TryGetValue(word.Key, out var value))
                        {
                            resultBag[word.Key] = value + word.Value;
                        }
                        else
                        {
                            resultBag.Add(word.Key, word.Value);
                        }
                    }
                    logger.LogMessage($"Book Merged");
                    Interlocked.Increment(ref count);
                }
            }, null, 5000, 1000);


            Parallel.ForEach(Info.Books, (book) =>
            {
                var text = Utils.GetFile(Utils.GetUrl(book.Id), logger).GetAwaiter().GetResult();
                logger.LogMessage($"Downloaded file {book.Title}");
                Utils.SaveFileAsync(Path.Combine(basePath, $"{book.Title}.txt"), text).GetAwaiter().GetResult();
                logger.LogMessage($"Saved file {book.Title}");

                var readText = Utils.ReadFileAsync(Path.Combine(basePath, $"{book.Title}.txt")).GetAwaiter().GetResult();
                logger.LogMessage($"Readed file {book.Title}");
                bags.Enqueue(Utils.BuildBagOfWords(readText));
                logger.LogMessage($"Bag of Words - {book.Title}");
            });

            while (count < Info.Books.Count) // Waiting for all bags to be merged
            {
                await Task.Delay(100);
            }

            timer.Dispose();

            logger.LogMessage("Dictionary to String");
            await Utils.SaveFileAsync(Path.Combine(basePath, "final.txt"), Utils.DictToString(resultBag));

            logger.LogMessage("resultBag.txt");

            Console.WriteLine("Press any key to finish");
            _ = Console.ReadKey();
        }
        static async Task OldVersionMain(string[] args)
        {
            var logger = new FileLogger();

            logger.LogMessage("Starting Async/Await test");


            Parallel.ForEach(Info.Books, (book) =>
            {
                var text = Utils.GetFile(Utils.GetUrl(book.Id), logger).GetAwaiter().GetResult();
                logger.LogMessage($"Downloaded file {book.Title}");
                Utils.SaveFileAsync($"{basePath}{book.Title}.txt", text).GetAwaiter().GetResult();
                logger.LogMessage($"Saved file {book.Title}");
            });

            // Code here
            //Downloading and saving files

            /*var tasks = new List<Task>();
             * foreach (var book in Info.Books)
             * {
             *  tasks.Add(Task.Run(async () => {
             *      var text = await Utils.GetFile(Utils.GetUrl(book.Id), logger);
             *      logger.LogMessage($"Downloaded file {book.Title}");
             *      await Utils.SaveFileAsync($"{basePath}{book.Title}.txt", text);
             *      logger.LogMessage($"Saved file {book.Title}");
             *  }));
             * }
             * await Task.WhenAll(tasks.ToArray());*/

            var      bags = new List <Dictionary <string, int> >();
            SpinLock sl   = new SpinLock(false);

            Parallel.ForEach(Info.Books, (book) =>
            {
                var text = Utils.ReadFileAsync($"{basePath}{book.Title}.txt").GetAwaiter().GetResult();
                logger.LogMessage($"Readed file {book.Title}");
                _spinLock = false;
                sl.Enter(ref _spinLock);
                bags.Add(Utils.BuildBagOfWords(text));
                sl.Exit(false);
                logger.LogMessage($"Bag of Words - {book.Title}");
            });
            //Reading files

            /*var bags = new List<Dictionary<string, int>>();
             * var tasksRead = new List<Task>();
             * foreach (var book in Info.Books)
             * {
             *  tasksRead.Add(Task.Run(async () => {
             *      var text = await Utils.ReadFileAsync($"{basePath}{book.Title}.txt");
             *      logger.LogMessage($"Readed file {book.Title}");
             *      bags.Add(Utils.BuildBagOfWords(text));
             *      logger.LogMessage($"Bag of Words - {book.Title}");
             *  }));
             * }
             * await Task.WhenAll(tasksRead.ToArray());*/

            //Merege Bags
            SpinLock sl1 = new SpinLock(false);

            Parallel.ForEach(bags, (bag) =>
            {
                foreach (var word in bag)
                {
                    var lockTaken = false;
                    sl1.Enter(ref lockTaken);
                    if (resultBag.TryGetValue(word.Key, out var value))
                    {
                        resultBag[word.Key] = value + word.Value;
                    }
                    else
                    {
                        resultBag.Add(word.Key, word.Value);
                    }
                    sl1.Exit();
                }
            });

            logger.LogMessage("Dictionary to String");
            await Utils.SaveFileAsync($"{basePath}finalBag.txt", Utils.DictToString(resultBag));

            logger.LogMessage("resultBag.txt");

            Console.WriteLine("Press any key to finish");
            _ = Console.ReadKey();
        }