/// <summary> /// Установить минимальное кол-во потов пула /// </summary> /// <param name="worker">Кол-во "обычных" потоков, /// если > 0, устанавливается значение не меньшее кол-ва процессоров (ядер), /// иначе значение не меняется</param> /// <param name="completionPort">Кол-во потоков асинхронного ожидания I/O, /// если > 0, устанавливается значение не меньшее кол-ва процессоров (ядер), /// иначе значение не меняется</param> /// <param name="autoGrowthMax">Флаг автоматического увеличения максимального кол-ва потоков, /// если заданы превышающие их значения</param> /// <returns>Флаг успешного выполнения</returns> public bool SetMinPoolLimits(int worker, int completionPort, bool autoGrowthMax = true) { bool result = false; int processors = Environment.ProcessorCount; worker = worker <= 0 ? Min.Worker : worker < processors ? processors : worker; completionPort = completionPort <= 0 ? Min.CompletionPort : completionPort < processors ? processors : completionPort; if (worker != Min.Worker || completionPort != Min.CompletionPort) { if (worker <= Max.Worker && completionPort <= Max.CompletionPort || autoGrowthMax && ThreadPool.SetMaxThreads(Math.Max(worker, Max.Worker), Math.Max(completionPort, Max.CompletionPort))) { if (result = ThreadPool.SetMinThreads(worker, completionPort)) { _min = null; _max = null; _available = null; } } } else { result = true; } return(result); }
/// <summary> /// Получить максимальные значения ограничений /// </summary> /// <param name="lim1">Первый набор ограничений</param> /// <param name="lim2">Второй набор ограничений</param> /// <returns>Составленный из двух набор максимальных ограничений</returns> public static ThreadLimits Max(ThreadLimits lim1, ThreadLimits lim2) { return(new ThreadLimits() { Worker = Math.Max(lim1 == null ? 0 : lim1.Worker, lim2 == null ? 0 : lim2.Worker), CompletionPort = Math.Max(lim1 == null ? 0 : lim1.CompletionPort, lim2 == null ? 0 : lim2.CompletionPort) }); }
/// <summary> /// Установить максимальное кол-во потоков /// </summary> /// <param name="worker">Кол-во "обычных" потоков, /// если > 0, устанавливается значение не меньшее кол-ва процессоров (ядер), /// иначе значение не меняется</param> /// <param name="completionPort">Кол-во потоков асинхронного ожидания I/O, /// если > 0, устанавливается значение не меньшее кол-ва процессоров (ядер), /// иначе значение не меняется</param> /// <returns>Флаг успешного выполнения</returns> public bool SetMaxPoolLimits(int worker, int completionPort) { bool result = false; int processors = Environment.ProcessorCount; worker = worker <= 0 ? Max.Worker : worker < processors ? processors : worker; completionPort = completionPort <= 0 ? Max.CompletionPort : completionPort < processors ? processors : completionPort; if (worker != Max.Worker || completionPort != Max.CompletionPort) { if (result = ThreadPool.SetMaxThreads(worker, completionPort)) { _max = null; _available = null; } } else { result = true; } return(result); }
/// <summary> /// Установить максимальное кол-во потоков /// </summary> /// <param name="limits">Ограничение на кол-во потоков</param> /// <returns>Флаг успешного выполнения</returns> public static bool SetMaxPoolLimits(this ThreadLimits limits) { return(limits == null ? false : Settings.SetMaxPoolLimits(limits.Worker, limits.CompletionPort)); }
/// <summary> /// Установить минимальное кол-во потоков пула /// </summary> /// <param name="limits">Ограничение на кол-во потоков</param> /// <param name="autoGrowthMax">Флаг автоматического увеличения максимального кол-ва потоков, /// если заданы превышающие их значения</param> /// <returns>Флаг успешного выполнения</returns> public static bool SetMinPoolLimits(this ThreadLimits limits, bool autoGrowthMax = true) { return(limits == null ? false : Settings.SetMinPoolLimits(limits.Worker, limits.CompletionPort, autoGrowthMax)); }