Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么线程不按优先级运行_C#_Multithreading - Fatal编程技术网

C# 为什么线程不按优先级运行

C# 为什么线程不按优先级运行,c#,multithreading,C#,Multithreading,我在这个程序中有一个问题,我想根据优先级运行线程,但当我运行这个程序时,输出是 say hello say bye 当准备运行的线程多于处理器时,系统使用线程优先级来决定运行哪个线程。在这种情况下,优先级较高的线程首先运行 在您的情况下,以下两种情况都是合理的: 在高优先级线程准备运行之前,低优先级线程已经启动,或者 您有足够的处理器,两个线程可以同时运行 线程优先级不是可用于确保执行顺序的工具。为此,您需要使用线程同步对象 通常,很少设置线程的优先级。通常,最好让操作系统决定如何调度线程 在t

我在这个程序中有一个问题,我想根据优先级运行线程,但当我运行这个程序时,输出是

say hello say bye
当准备运行的线程多于处理器时,系统使用线程优先级来决定运行哪个线程。在这种情况下,优先级较高的线程首先运行

在您的情况下,以下两种情况都是合理的:

  • 在高优先级线程准备运行之前,低优先级线程已经启动,或者
  • 您有足够的处理器,两个线程可以同时运行
  • 线程优先级不是可用于确保执行顺序的工具。为此,您需要使用线程同步对象


    通常,很少设置线程的优先级。通常,最好让操作系统决定如何调度线程

    在th之后启动th1可能会:

    th1.Start();
    th.Start()
    
    但是仍然没有保证,您需要阻塞直到完成,这就引出了为什么要使用线程的问题

    Sayhello();
    Saybye();
    
    如果必须,您需要在打招呼时发出信号,以便再见继续:

    private ManualResetEvent waitHandel;
    
    public void Sayhello()
    {
        Console.WriteLine("say hello");
        waitHandel.Set();
    }
    
    public void Saybye()
    {
        waitHandel.WaitOne();
        Console.WriteLine("say bye");
    }
    
    
    static void Main(string[] args)
    {
        waitHandel = new ManualResetEvent(false);
    
        Thread  th = new Thread(new ThreadStart(ob.Sayhello));
        th.Priority = ThreadPriority.Lowest;
        th.Start();
    
        Thread th1 = new Thread(new ThreadStart(ob.Saybye));
        th1.Priority = ThreadPriority.Highest;
        th1.Start();
    
        Console.ReadLine();
    }
    

    非常确定第一个线程在第二个线程创建之前就已经完成了。我想你可以在这里找到一个合适的答案:我通常不会这么直截了当,但是。。。如果你真的不知道自己在做什么,那就别管线程优先级了。它不是一个简单的设置,让你控制线程如何执行,它是一个非常复杂的机制,专为极端情况而设计,而不是日常使用。也许你应该重新提出你的问题,询问如何解决你的实际问题,而不是尝试一个没有多大意义的场景。
    Sayhello();
    Saybye();
    
    private ManualResetEvent waitHandel;
    
    public void Sayhello()
    {
        Console.WriteLine("say hello");
        waitHandel.Set();
    }
    
    public void Saybye()
    {
        waitHandel.WaitOne();
        Console.WriteLine("say bye");
    }
    
    
    static void Main(string[] args)
    {
        waitHandel = new ManualResetEvent(false);
    
        Thread  th = new Thread(new ThreadStart(ob.Sayhello));
        th.Priority = ThreadPriority.Lowest;
        th.Start();
    
        Thread th1 = new Thread(new ThreadStart(ob.Saybye));
        th1.Priority = ThreadPriority.Highest;
        th1.Start();
    
        Console.ReadLine();
    }