Почему QueueUserWorkItem запускается медленно?C#

Место общения программистов C#
Ответить
Anonymous
 Почему QueueUserWorkItem запускается медленно?

Сообщение Anonymous »

Я пытался измерить, сколько потоков уничтожит приложение .net. Но в процессе я обнаружил, что вращение большего количества потоков, чем нескольких, происходит очень медленно. Мой вопрос: почему?
У меня есть этот код:

Код: Выделить всё

using System.Diagnostics;

namespace ThreadPoolTest
{
internal class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello, World!");
StartTest();
}

static int count = 0;
static void StartTest()
{
ThreadPool.GetAvailableThreads(out var w, out var c);
ThreadPool.GetMaxThreads(out var mw, out var mc);
Console.WriteLine($"starting --- available {w} max {mw} current {ThreadPool.ThreadCount} completed {ThreadPool.CompletedWorkItemCount} pending {ThreadPool.PendingWorkItemCount}");

int last_print = 0;

var sw = Stopwatch.StartNew();

while (true)
{
ThreadPool.UnsafeQueueUserWorkItem(i =>
{
var _count = Interlocked.Increment(ref count);

Thread.Sleep(1000000000);

int n = 0;
while (true)
{
n++;
Thread.Sleep(1000);
}
},
false);

int _lastCount = count;
if (_lastCount % 30 == 0 && _lastCount != last_print)
{
last_print = _lastCount;

sw.Stop();

ThreadPool.GetAvailableThreads(out w, out c);
ThreadPool.GetMaxThreads(out mw, out mc);
Console.WriteLine($"{sw.Elapsed} --- available {w} max {mw} current {ThreadPool.ThreadCount} completed {ThreadPool.CompletedWorkItemCount} pending {ThreadPool.PendingWorkItemCount}");

sw.Restart();
}

}
}
}
}
чтобы прокрутить 30 фоновых потоков, сначала требуется 26 секунд ~ 150, а затем оно начинает расти до 1 минуты.
примечание: я использовал небезопасную версию в примере, но «безопасная» ведет себя так же, только даже медленнее.
это образец вывода:
Изображение


Подробнее здесь: https://stackoverflow.com/questions/790 ... w-to-start
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»