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