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 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(); }
static void Main(string[] args) { var logger = new FileLogger(); string path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.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(); }
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(); }