Я понимаю, что если я использую async, поток делает веб-запрос и движется дальше. Когда ответ возвращается, другой поток поднимает его оттуда. Таким образом, существует меньшее количество связанных нитей, сидящих без дела. Разве это не означает, что максимальное количество живых потоков снизится? Но в приведенном ниже примере код, который не использует async, заканчивается использованием меньшего количества потоков. Может кто-нибудь объяснить, почему?
Код без async (использует меньшие потоки):
using System;
using System.Diagnostics;
using System.IO;
using System.Net;
using System.Threading;
namespace NoAsync
{
internal class Program
{
private const int totalCalls = 100;
private static void Main(string[] args)
{
for (int i = 1; i <= totalCalls; i++)
{
ThreadPool.QueueUserWorkItem(GoogleSearch, i);
}
Thread.Sleep(100000);
}
private static void GoogleSearch(object searchTerm)
{
Thread.CurrentThread.IsBackground = false;
string url = @"https://www.google.com/search?q=" + searchTerm;
Console.WriteLine("Total number of threads in use={0}", Process.GetCurrentProcess().Threads.Count);
WebRequest wr = WebRequest.Create(url);
var httpWebResponse = (HttpWebResponse) wr.GetResponse();
var reader = new StreamReader(httpWebResponse.GetResponseStream());
string responseFromServer = reader.ReadToEnd();
//Console.WriteLine(responseFromServer); // Display the content.
httpWebResponse.Close();
Console.WriteLine("Total number of threads in use={0}", Process.GetCurrentProcess().Threads.Count);
}
}
}
Код с async (использует больше потоков)
using System;
using System.Diagnostics;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
using System.Collections.Generic;
namespace AsyncAwait
{
internal class Program
{
private const int totalCalls = 100;
private static DateTime start = System.DateTime.Now;
private static void Main(string[] args)
{
var tasks = new List<Task>();
for (int i = 1; i <= totalCalls; i++)
{
var searchTerm = i;
var t = GoogleSearch(searchTerm);
tasks.Add(t);
}
Task.WaitAll(tasks.ToArray());
Console.WriteLine("Hit Enter to exit");
Console.ReadLine();
}
private static async Task GoogleSearch(object searchTerm)
{
Thread.CurrentThread.IsBackground = false;
string url = @"https://www.google.com/search?q=" + searchTerm;
Console.WriteLine("Total number of threads in use={0}", Process.GetCurrentProcess().Threads.Count);
using (var client = new HttpClient())
{
using (HttpResponseMessage response = await client.GetAsync(url))
{
HttpContent content = response.Content;
content.Dispose();
Console.WriteLine("Total number of threads in use={0}", Process.GetCurrentProcess().Threads.Count);
Console.WriteLine("TimeSpan consumed {0}", System.DateTime.Now.Subtract(start));
}
}
}
}
}
Я понимаю, что мои результаты включают неуправляемые потоки. Но не должно ли общее число потоков быть ниже?
Обновление: Я обновил асинхронный вызов с кодом, предоставленным Noseratio