예제 #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();
        }
예제 #2
0
        static void Main(string[] args)
        {
            var wordPattern = new Regex(@"\w+");
            var logger      = new FileLogger();
            var words       = new Dictionary <string, int>(StringComparer.CurrentCultureIgnoreCase);

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

            var logSempahore = new Semaphore(1, 1);
            var getSemaphore = new Semaphore(5, 5);
            var bowSemaphore = new Semaphore(1, 1);

            var books = new List <string[]>();

            logger.LogMessage("Starting Download");
            Parallel.ForEach(Info.Books, x =>
            {
                getSemaphore.WaitOne();
                var book = Utils.GetFile(Utils.GetUrl(x.Id));
                getSemaphore.Release();

                if (book.Length > 0)
                {
                    logSempahore.WaitOne();
                    logger.LogMessage($"Finished Download{x.Title}");
                    logSempahore.Release();

                    logSempahore.WaitOne();
                    logger.LogMessage($"Saving {x.Title}");
                    logSempahore.Release();

                    Utils.SaveFile(x.Title, book);

                    logSempahore.WaitOne();
                    logger.LogMessage($"Suceesfully saved {x.Title}");
                    logSempahore.Release();

                    bowSemaphore.WaitOne();
                    foreach (Match match in wordPattern.Matches(book))
                    {
                        var currentCount = 0;
                        var word         = Regex.Replace(match.Value, @"[^0 - 9A - Za - z._\s]", "");
                        words.TryGetValue(match.Value, out currentCount);

                        currentCount++;
                        words[match.Value] = currentCount;
                    }
                    bowSemaphore.Release();
                }
            });

            logger.LogMessage("Started to log BoW");
            logger.LogBoW(words);
            logger.LogMessage("Finished to log BoW");

            Console.WriteLine("Press any key to finish");
            _ = Console.ReadKey();
        }
예제 #3
0
        static void Main(string[] args)
        {
            var    logger = new FileLogger();
            string path   = Path.Combine(Environment.GetFolderPath(Environment.SpecialFo‌​lder.Desktop), "Books");

            logger.LogMessage("Starting Async/Await test");
            createFolder(path);
            List <Task> tasks = new List <Task>();

            foreach (var book in Info.Books)
            {
                tasks.Add(Task.Factory.StartNew(async() => {
                    logger.LogMessage("Starting downloading book :" + book.Id + " " + book.Title);
                    var bookFile = await Utils.GetFile(Utils.GetUrl(book.Id));
                    logger.LogMessage("Finishing downloading book :" + book.Id + " " + book.Title);
                    return(bookFile);
                })
                          .ContinueWith((bookFile) => {
                    logger.LogMessage("Starting saving book :" + book.Id + " " + book.Title);
                    Utils.SaveFile(Path.Combine(path, book.Title + ".txt"), bookFile.Result.Result);
                    logger.LogMessage("Finishing saving book :" + book.Id + " " + book.Title);
                    return(bookFile);
                })
                          .ContinueWith((bookFile) => {
                    logger.LogMessage("Starting makeing the bag of words :" + book.Id + " " + book.Title);
                    BagOfWords(bookFile.Result.Result.Result);
                    logger.LogMessage("Finishing makeing the bag of words:" + book.Id + " " + book.Title);
                }));
            }
            Task.WhenAll(tasks).ContinueWith((x) =>
            {
                logger.LogMessage("Counting words in the bag: ");
                Console.WriteLine("Counting words in the bag: ");
                foreach (var word in bagOfWords)
                {
                    Console.WriteLine($"The word: {word.Key} appears {word.Value} times");
                    logger.LogMessage($"The word: {word.Key} appears {word.Value} times");
                }
                ;
                Console.WriteLine("Press any key to finish");
            });


            // Code here
            Console.WriteLine("Wait I am processing the data");

            _ = Console.ReadKey();
        }
예제 #4
0
        static void Main(string[] args)
        {
            var logger = new FileLogger();
            logger.LogMessage("Starting Async/Await test");
            var path = "C:/Users/ramiro.flores/Desktop/Books/";

            var downloadTasks = new List<Task>();
            var bows = new List<Dictionary<string, int>>();

            Info.Books.ForEach((x) =>
                            downloadTasks.Add(new Task(() =>
                                Utils.SaveFile(path + $"{x.Title}.txt", Utils.GetFile(Utils.GetUrl(x.Id)))
                                )));

            downloadTasks.ForEach(x => x.Start());
            Task.WaitAll(downloadTasks.ToArray());

            var directory = new DirectoryInfo(path);
            var bookToBoowTasks = new List<Task>();

            Info.Books.ForEach((x) =>
                           bookToBoowTasks.Add(new Task(
                               () =>
                               {
                                   //create the bow
                                   var text = File.ReadAllText(path + $"{x.Title}.txt");
                                   var words = Regex.Matches(text, @"\w+").Cast<Match>().Where(m => m.Success).Select(m => m.Value);
                                   var bow = words.GroupBy(w => w).ToDictionary(g => g.Key, g => g.Count());
                                   bows.Add(bow);
                               }
                               )
                           ));

            bookToBoowTasks.ForEach(x => x.Start());
            Task.WaitAll(bookToBoowTasks.ToArray());

            bows.ForEach(x => {
                foreach (KeyValuePair<string, int> kvp in x)
                {
                    logger.LogMessage($"Key = {kvp.Key}, Value = {kvp.Value}");
                }
            });


            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();
        }