.NET Core: почему так много потоков, когда я использую асинхронный ввод-вывод (ОС Windows)? - PullRequest
0 голосов
/ 25 мая 2018

Я немного смущен тем, сколько потоков создает ядро ​​.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 их так много создает?

...