线程 将优先级设置为“正常”,并在调用的方法上设置为“低于正常”

本文关键字:设置 方法 低于正常 调用 于正常 优先级 正常 线程 | 更新日期: 2023-09-27 18:30:00

我有一个线程说,

System.Threading.Thread archiveThread = new System.Threading.Thread(_archive);
archiveThread.Priority = System.Threading.ThreadPriority.Normal;

设置为 ThreadPriority.Normal .当我在单独的类上调用 _archive() 中的某个函数时,它会重置Thread.CurrentThread.Priority = ThreadPriority.BelowNormal;

无论我需要"重置"优先级的原因是什么,操作系统对此的响应是什么? ThreadPriority.BelowNormal会覆盖最初声明ThreadPriority Normal吗?还是会保留原始Normal设置?

蒂亚


-------------模拟----------

namespace ThreadPoolNumThreads
{
    class Program
    {
        static void Main(string[] args)
        {
            TPoolNumThreads t = new TPoolNumThreads();
            t.Start();
            Console.ReadKey();
        }
    }

    class TryResetThreadPriority
    {
        internal void Reset()
        {
            Thread.CurrentThread.Priority = ThreadPriority.BelowNormal;
        }
    }
    class TPoolNumThreads
    {
        internal void Start()
        {
            Thread monitor = new Thread(StartMonitor);
            monitor.Priority = ThreadPriority.Normal;
            monitor.Start();
        }
        private void StartMonitor(object obj)
        {
            ArrayList thisArray = new ArrayList();

            while (true)
            {
                Console.WriteLine(" -----------> Threads.Priority {0}", Thread.CurrentThread.Priority);
                TryResetThreadPriority myTry = new TryResetThreadPriority();
                myTry.Reset();
                Console.WriteLine(" -----------> Threads.Priority {0}", Thread.CurrentThread.Priority);
                Thread.Sleep(5000);
            }
        }
    }
}

线程 将优先级设置为“正常”,并在调用的方法上设置为“低于正常”

线程优先级是线程的可变状态。如果某些内容更改了优先级,那么这就是线程的新优先级。

所以,是的......如果线程的优先级更改为BelowNormal,那么只要它具有该优先级,这就是用于调度的优先级。

您应该注意,托管线程可能与操作系统线程完全对应,也可能不完全对应。因此,考虑框架如何处理线程优先级会更有用。框架当然可以将所有这些委托给操作系统,但框架对实现细节有最终决定权。现在有很多不同的.NET实现。:)

最后,你

没有问,你可能已经知道了,但你调用的函数降低了线程优先级可能是有充分理由的。这是长时间运行的 CPU 密集型线程的常用技术,允许此类线程在不干扰其他正常优先级任务(如用户界面(的情况下完成其工作。通常,仅当此类线程不再忙于处理 CPU 密集型任务时,才应将优先级设置回Normal

(当然,通常这些任务无论如何都会被赋予自己的专用线程,这使得优先级问题变得毫无意义,因为甚至没有在该线程上进行其他处理(。