private async void btnScrape_Click(object sender, EventArgs e) { if (!ValidateInput()) { MessageBox.Show("Invalid input, check your input/settings before trying again.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } if (!String.IsNullOrEmpty(txtProxy.Text) && !String.IsNullOrWhiteSpace(txtProxy.Text)) { _proxy = new Proxy(txtProxy.Text, ':'); } List <string> users = new List <string>(); if (rbFromFile.Checked) { foreach (string s in Helper.ReadAllLinesFromFile(txtInput.Text)) { users.Add(s); } List <Task> tasks = new List <Task>(); using (SemaphoreSlim semaphore = new SemaphoreSlim(Convert.ToInt32(txtThreads.Text))) { for (int i = 0; i < users.Count; i++) { string user = users[i]; // why? await semaphore.WaitAsync(); tasks.Add( Task.Run(async() => { try { TwitterScraperData scraperData = await _scraper.GetDetails(txtUserAgent.Text, user, Convert.ToDouble(txtRequestTimeout.Text), _proxy.webProxy); AddItemsToDgv(scraperData); } catch (Exception ex) { Console.WriteLine("Error msg: {0}, index: {1}, users.Count: {2}", ex.Message, i, users.Count); } finally { semaphore.Release(); } })); } await Task.WhenAll(tasks); } users.Clear(); } else if (rbSingleUser.Checked) { try { TwitterScraperData scraperData = await _scraper.GetDetails(txtUserAgent.Text, txtInput.Text, Convert.ToDouble(txtRequestTimeout.Text), _proxy.webProxy); AddItemsToDgv(scraperData); } catch (InvalidUsernameException ex) { Console.WriteLine(ex.Message); } } }