Я немного смущен тем, сколько потоков создает ядро .net.У меня есть очень простая программа, которая извлекает статический контнет с сервера нашего приложения по массиву URL:
class Program
{
static void Main(string[] args)
{
//ThreadPool.SetMaxThreads(10, 10);
var urls = new string[]
{
"http://url1.....",
"http://url2.....",
.......
};
var taskCount = 100;
var count = 1000;
var httpClient = new HttpClient {Timeout = TimeSpan.FromMilliseconds(10000)};
var tasks = new Collection<Task>();
var threads = new ConcurrentBag<int>();
for (var i = 0; i < taskCount; i++)
{
tasks.Add(Task.Run(async () =>
{
var sw = new Stopwatch();
for (var j = 0; j < count; j++)
{
foreach (var url in urls)
{
sw.Start();
try
{
threads.Add(Thread.CurrentThread.ManagedThreadId);
using (var r = await httpClient.GetAsync(url))
{
threads.Add(Thread.CurrentThread.ManagedThreadId);
if (r.StatusCode != HttpStatusCode.OK)
{
sw.Stop();
Console.WriteLine($"[{url}] - status: [{r.StatusCode}], time: [{sw.ElapsedMilliseconds}]");
}
else
{
using (var content = r.Content)
{
threads.Add(Thread.CurrentThread.ManagedThreadId);
_ = await content.ReadAsByteArrayAsync();
threads.Add(Thread.CurrentThread.ManagedThreadId);
sw.Stop();
Console.WriteLine($"[{url}] - status: [{r.StatusCode}], time: [{sw.ElapsedMilliseconds}]");
}
}
}
}
catch (Exception e)
{
Console.WriteLine(e);
}
sw.Reset();
}
}
}));
}
Console.ReadKey();
File.AppendAllText(@"E:\temp\log.txt", $"t count: {threads.ToList().Distinct().ToList().Count}\r\n");
}
}
Только 100 задач извлекают контент по URL, регистрируют его и делают это снова.Когда я запускаю эту программу в ОС Windows с помощью .NET Core 2.0, я вижу 10 потоков в файле журнала.Я понимаю, что это потоки из пула потоков, но когда я смотрю на количество потоков в Windows Resource Monitor, я вижу 120 потоков.Зачем?Если я запускаю эту программу в ОС Windows с использованием .NET Framework 4.7.1, я вижу 17 потоков в файле журнала и 37 потоков в мониторе ресурсов Windows.Если я использую ThreadPool.SetMaxThreads (10, 10) для обоих случаев, ничего не изменится, я все равно вижу 120 потоков в .NET Core 2.0 и около 37 потоков в .NET Framework 4.7.1, просматривая Windows Resource Monitor.Я не понимаю почему.Пожалуйста, кто-нибудь объяснит мне, что это за 120 потоков и почему .NET Core 2.0 их так много создает?