Thread Classe

Définition

Crée et contrôle un thread, définit sa priorité et obtient son état.

public ref class Thread sealed : System::Runtime::ConstrainedExecution::CriticalFinalizerObject
public ref class Thread sealed
public ref class Thread sealed : System::Runtime::InteropServices::_Thread
public ref class Thread sealed : System::Runtime::ConstrainedExecution::CriticalFinalizerObject, System::Runtime::InteropServices::_Thread
public sealed class Thread : System.Runtime.ConstrainedExecution.CriticalFinalizerObject
[System.Runtime.InteropServices.ComVisible(true)]
public sealed class Thread
[System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.None)]
public sealed class Thread : System.Runtime.InteropServices._Thread
[System.Runtime.InteropServices.ComVisible(true)]
[System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.None)]
public sealed class Thread : System.Runtime.ConstrainedExecution.CriticalFinalizerObject, System.Runtime.InteropServices._Thread
[System.Runtime.InteropServices.ComVisible(true)]
[System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.None)]
public sealed class Thread : System.Runtime.ConstrainedExecution.CriticalFinalizerObject
type Thread = class
    inherit CriticalFinalizerObject
[<System.Runtime.InteropServices.ComVisible(true)>]
type Thread = class
[<System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.None)>]
type Thread = class
    interface _Thread
[<System.Runtime.InteropServices.ComVisible(true)>]
[<System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.None)>]
type Thread = class
    inherit CriticalFinalizerObject
    interface _Thread
[<System.Runtime.InteropServices.ComVisible(true)>]
[<System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.None)>]
type Thread = class
    inherit CriticalFinalizerObject
Public NotInheritable Class Thread
Inherits CriticalFinalizerObject
Public NotInheritable Class Thread
Public NotInheritable Class Thread
Implements _Thread
Public NotInheritable Class Thread
Inherits CriticalFinalizerObject
Implements _Thread
Héritage
Héritage
Thread
Attributs
Implémente

Exemples

L’exemple suivant illustre les fonctionnalités de Threading simples.

// [C++]
// Compile using /clr option.
using namespace System;
using namespace System::Threading;

// Simple threading scenario:  Start a Shared method running
// on a second thread.
public ref class ThreadExample
{
public:

   // The ThreadProc method is called when the thread starts.
   // It loops ten times, writing to the console and yielding 
   // the rest of its time slice each time, and then ends.
   static void ThreadProc()
   {
      for ( int i = 0; i < 10; i++ )
      {
         Console::Write(  "ThreadProc: " );
         Console::WriteLine( i );
         
         // Yield the rest of the time slice.
         Thread::Sleep( 0 );

      }
   }

};

int main()
{
   Console::WriteLine( "Main thread: Start a second thread." );
   
   // Create the thread, passing a ThreadStart delegate that
   // represents the ThreadExample::ThreadProc method.  For a 
   // delegate representing a static method, no object is
   // required.
   Thread^ oThread = gcnew Thread( gcnew ThreadStart( &ThreadExample::ThreadProc ) );
   
   // Start ThreadProc.  Note that on a uniprocessor, the new 
   // thread does not get any processor time until the main thread 
   // is preempted or yields.  Uncomment the Thread::Sleep that 
   // follows oThread->Start() to see the difference.
   oThread->Start();
   
   //Thread::Sleep(0);
   for ( int i = 0; i < 4; i++ )
   {
      Console::WriteLine(  "Main thread: Do some work." );
      Thread::Sleep( 0 );

   }
   Console::WriteLine(  "Main thread: Call Join(), to wait until ThreadProc ends." );
   oThread->Join();
   Console::WriteLine(  "Main thread: ThreadProc.Join has returned.  Press Enter to end program." );
   Console::ReadLine();
   return 0;
}
using System;
using System.Threading;

// Simple threading scenario:  Start a static method running
// on a second thread.
public class ThreadExample {
    // The ThreadProc method is called when the thread starts.
    // It loops ten times, writing to the console and yielding
    // the rest of its time slice each time, and then ends.
    public static void ThreadProc() {
        for (int i = 0; i < 10; i++) {
            Console.WriteLine("ThreadProc: {0}", i);
            // Yield the rest of the time slice.
            Thread.Sleep(0);
        }
    }

    public static void Main() {
        Console.WriteLine("Main thread: Start a second thread.");
        // The constructor for the Thread class requires a ThreadStart
        // delegate that represents the method to be executed on the
        // thread.  C# simplifies the creation of this delegate.
        Thread t = new Thread(new ThreadStart(ThreadProc));

        // Start ThreadProc.  Note that on a uniprocessor, the new
        // thread does not get any processor time until the main thread
        // is preempted or yields.  Uncomment the Thread.Sleep that
        // follows t.Start() to see the difference.
        t.Start();
        //Thread.Sleep(0);

        for (int i = 0; i < 4; i++) {
            Console.WriteLine("Main thread: Do some work.");
            Thread.Sleep(0);
        }

        Console.WriteLine("Main thread: Call Join(), to wait until ThreadProc ends.");
        t.Join();
        Console.WriteLine("Main thread: ThreadProc.Join has returned.  Press Enter to end program.");
        Console.ReadLine();
    }
}
Imports System.Threading

' Simple threading scenario:  Start a Shared method running
' on a second thread.
Public Class ThreadExample
    ' The ThreadProc method is called when the thread starts.
    ' It loops ten times, writing to the console and yielding 
    ' the rest of its time slice each time, and then ends.
    Public Shared Sub ThreadProc()
        Dim i As Integer
        For i = 0 To 9
            Console.WriteLine("ThreadProc: {0}", i)
            ' Yield the rest of the time slice.
            Thread.Sleep(0)
        Next
    End Sub

    Public Shared Sub Main()
        Console.WriteLine("Main thread: Start a second thread.")
        ' The constructor for the Thread class requires a ThreadStart 
        ' delegate.  The Visual Basic AddressOf operator creates this
        ' delegate for you.
        Dim t As New Thread(AddressOf ThreadProc)

        ' Start ThreadProc.  Note that on a uniprocessor, the new 
        ' thread does not get any processor time until the main thread 
        ' is preempted or yields.  Uncomment the Thread.Sleep that 
        ' follows t.Start() to see the difference.
        t.Start()
        'Thread.Sleep(0)

        Dim i As Integer
        For i = 1 To 4
            Console.WriteLine("Main thread: Do some work.")
            Thread.Sleep(0)
        Next

        Console.WriteLine("Main thread: Call Join(), to wait until ThreadProc ends.")
        t.Join()
        Console.WriteLine("Main thread: ThreadProc.Join has returned.  Press Enter to end program.")
        Console.ReadLine()
    End Sub
End Class

Ce code produit une sortie similaire à ce qui suit :

[VB, C++, C#]  
Main thread: Start a second thread.  
Main thread: Do some work.  
ThreadProc: 0  
Main thread: Do some work.  
ThreadProc: 1  
Main thread: Do some work.  
ThreadProc: 2  
Main thread: Do some work.  
ThreadProc: 3  
Main thread: Call Join(), to wait until ThreadProc ends.  
ThreadProc: 4  
ThreadProc: 5  
ThreadProc: 6  
ThreadProc: 7  
ThreadProc: 8  
ThreadProc: 9  
Main thread: ThreadProc.Join has returned.  Press Enter to end program.  

Remarques

Lorsqu’un processus démarre, le common language runtime crée automatiquement un seul thread de premier plan pour exécuter le code de l’application. Avec ce thread de premier plan principal, un processus peut créer un ou plusieurs threads pour exécuter une partie du code de programme associé au processus. Ces threads peuvent être exécutés au premier plan ou en arrière-plan. En outre, vous pouvez utiliser la ThreadPool classe pour exécuter du code sur des threads de travail qui sont gérés par le Common Language Runtime.

Contenu de cette section

Démarrage d’un thread
Récupération des objets thread
Threads de premier plan et d’arrière-plan
Culture et threads
Obtention d’informations sur et le contrôle des threads

Démarrage d’un thread

Vous démarrez un thread en fournissant un délégué qui représente la méthode que le thread doit exécuter dans son constructeur de classe. Vous appelez ensuite la Start méthode pour commencer l’exécution.

Les Thread constructeurs peuvent accepter l’un des deux types délégués, selon que vous pouvez passer un argument à la méthode à exécuter :

  • Si la méthode ne possède pas d’argument, vous transmettez un ThreadStart délégué au constructeur. Il a la signature suivante :

    public delegate void ThreadStart()  
    
    Public Delegate Sub ThreadStart()  
    

    L’exemple suivant crée et démarre un thread qui exécute la ExecuteInForeground méthode. La méthode affiche des informations sur certaines propriétés de thread, puis exécute une boucle dans laquelle elle s’interrompt pendant une demi-seconde et affiche le nombre de secondes écoulées. Lorsque le thread a été exécuté pendant au moins cinq secondes, la boucle se termine et le thread termine l’exécution.

    using System;
    using System.Diagnostics;
    using System.Threading;
    
    public class Example
    {
       public static void Main()
       {
          var th = new Thread(ExecuteInForeground);
          th.Start();
          Thread.Sleep(1000);
          Console.WriteLine("Main thread ({0}) exiting...",
                            Thread.CurrentThread.ManagedThreadId);
       }
    
       private static void ExecuteInForeground()
       {
          var sw = Stopwatch.StartNew();
          Console.WriteLine("Thread {0}: {1}, Priority {2}",
                            Thread.CurrentThread.ManagedThreadId,
                            Thread.CurrentThread.ThreadState,
                            Thread.CurrentThread.Priority);
          do {
             Console.WriteLine("Thread {0}: Elapsed {1:N2} seconds",
                               Thread.CurrentThread.ManagedThreadId,
                               sw.ElapsedMilliseconds / 1000.0);
             Thread.Sleep(500);
          } while (sw.ElapsedMilliseconds <= 5000);
          sw.Stop();
       }
    }
    // The example displays output like the following:
    //       Thread 3: Running, Priority Normal
    //       Thread 3: Elapsed 0.00 seconds
    //       Thread 3: Elapsed 0.51 seconds
    //       Main thread (1) exiting...
    //       Thread 3: Elapsed 1.02 seconds
    //       Thread 3: Elapsed 1.53 seconds
    //       Thread 3: Elapsed 2.05 seconds
    //       Thread 3: Elapsed 2.55 seconds
    //       Thread 3: Elapsed 3.07 seconds
    //       Thread 3: Elapsed 3.57 seconds
    //       Thread 3: Elapsed 4.07 seconds
    //       Thread 3: Elapsed 4.58 seconds
    
    Imports System.Diagnostics
    Imports System.Threading
    
    Module Example
       Public Sub Main()
          Dim th As New Thread(AddressOf ExecuteInForeground)
          th.Start()
          Thread.Sleep(1000)
          Console.WriteLine("Main thread ({0}) exiting...", Thread.CurrentThread.ManagedThreadId) 
       End Sub
       
       Private Sub ExecuteInForeground()
          Dim start As DateTime = DateTime.Now
          Dim sw As Stopwatch = Stopwatch.StartNew()
          Console.WriteLine("Thread {0}: {1}, Priority {2}", 
                            Thread.CurrentThread.ManagedThreadId,
                            Thread.CurrentThread.ThreadState,
                            Thread.CurrentThread.Priority)
          Do 
             Console.WriteLine("Thread {0}: Elapsed {1:N2} seconds", 
                               Thread.CurrentThread.ManagedThreadId,
                               sw.ElapsedMilliseconds / 1000)
             Thread.Sleep(500)
          Loop While sw.ElapsedMilliseconds <= 5000
          sw.Stop() 
       End Sub
    End Module
    ' The example displays output like the following:
    '       Thread 3: Running, Priority Normal
    '       Thread 3: Elapsed 0.00 seconds
    '       Thread 3: Elapsed 0.51 seconds
    '       Main thread (1) exiting...
    '       Thread 3: Elapsed 1.02 seconds
    '       Thread 3: Elapsed 1.53 seconds
    '       Thread 3: Elapsed 2.05 seconds
    '       Thread 3: Elapsed 2.55 seconds
    '       Thread 3: Elapsed 3.07 seconds
    '       Thread 3: Elapsed 3.57 seconds
    '       Thread 3: Elapsed 4.07 seconds
    '       Thread 3: Elapsed 4.58 seconds
    
  • Si la méthode a un argument, vous transmettez un ParameterizedThreadStart délégué au constructeur. Il a la signature suivante :

    public delegate void ParameterizedThreadStart(object obj)  
    
    Public Delegate Sub ParameterizedThreadStart(obj As Object)  
    

    la méthode exécutée par le délégué peut ensuite effectuer un cast (en C#) ou convertir (en Visual Basic) le paramètre vers le type approprié.

    L’exemple suivant est identique au précédent, à ceci près qu’il appelle le Thread(ParameterizedThreadStart) constructeur. Cette version de la ExecuteInForeground méthode a un paramètre unique qui représente le nombre approximatif de millisecondes pendant lesquelles la boucle doit s’exécuter.

    using System;
    using System.Diagnostics;
    using System.Threading;
    
    public class Example
    {
       public static void Main()
       {
          var th = new Thread(ExecuteInForeground);
          th.Start(4500);
          Thread.Sleep(1000);
          Console.WriteLine("Main thread ({0}) exiting...",
                            Thread.CurrentThread.ManagedThreadId);
       }
    
       private static void ExecuteInForeground(Object obj)
       {
          int interval;
          try {
             interval = (int) obj;
          }
          catch (InvalidCastException) {
             interval = 5000;
          }
          var sw = Stopwatch.StartNew();
          Console.WriteLine("Thread {0}: {1}, Priority {2}",
                            Thread.CurrentThread.ManagedThreadId,
                            Thread.CurrentThread.ThreadState,
                            Thread.CurrentThread.Priority);
          do {
             Console.WriteLine("Thread {0}: Elapsed {1:N2} seconds",
                               Thread.CurrentThread.ManagedThreadId,
                               sw.ElapsedMilliseconds / 1000.0);
             Thread.Sleep(500);
          } while (sw.ElapsedMilliseconds <= interval);
          sw.Stop();
       }
    }
    // The example displays output like the following:
    //       Thread 3: Running, Priority Normal
    //       Thread 3: Elapsed 0.00 seconds
    //       Thread 3: Elapsed 0.52 seconds
    //       Main thread (1) exiting...
    //       Thread 3: Elapsed 1.03 seconds
    //       Thread 3: Elapsed 1.55 seconds
    //       Thread 3: Elapsed 2.06 seconds
    //       Thread 3: Elapsed 2.58 seconds
    //       Thread 3: Elapsed 3.09 seconds
    //       Thread 3: Elapsed 3.61 seconds
    //       Thread 3: Elapsed 4.12 seconds
    
    Imports System.Diagnostics
    Imports System.Threading
    
    Module Example
       Public Sub Main()
          Dim th As New Thread(AddressOf ExecuteInForeground)
          th.Start(4500)
          Thread.Sleep(1000)
          Console.WriteLine("Main thread ({0}) exiting...", Thread.CurrentThread.ManagedThreadId) 
       End Sub
       
       Private Sub ExecuteInForeground(obj As Object)
          Dim interval As Integer
          If IsNumeric(obj) Then
             interval = CInt(obj)
          Else
             interval = 5000
          End If   
          Dim start As DateTime = DateTime.Now
          Dim sw As Stopwatch = Stopwatch.StartNew()
          Console.WriteLine("Thread {0}: {1}, Priority {2}", 
                            Thread.CurrentThread.ManagedThreadId,
                            Thread.CurrentThread.ThreadState,
                            Thread.CurrentThread.Priority)
          Do 
             Console.WriteLine("Thread {0}: Elapsed {1:N2} seconds", 
                               Thread.CurrentThread.ManagedThreadId,
                               sw.ElapsedMilliseconds / 1000)
             Thread.Sleep(500)
          Loop While sw.ElapsedMilliseconds <= interval
          sw.Stop() 
       End Sub
    End Module
    ' The example displays output like the following:
    '       Thread 3: Running, Priority Normal
    '       Thread 3: Elapsed 0.00 seconds
    '       Thread 3: Elapsed 0.52 seconds
    '       Main thread (1) exiting...
    '       Thread 3: Elapsed 1.03 seconds
    '       Thread 3: Elapsed 1.55 seconds
    '       Thread 3: Elapsed 2.06 seconds
    '       Thread 3: Elapsed 2.58 seconds
    '       Thread 3: Elapsed 3.09 seconds
    '       Thread 3: Elapsed 3.61 seconds
    '       Thread 3: Elapsed 4.12 seconds
    

Il n’est pas nécessaire de conserver une référence à un Thread objet une fois que vous avez démarré le thread. Le thread continue à s’exécuter jusqu’à ce que la procédure de thread soit terminée.

Récupération des objets thread

vous pouvez utiliser la propriété statique ( Shared dans Visual Basic) CurrentThread pour récupérer une référence au thread en cours d’exécution à partir du code exécuté par le thread. L’exemple suivant utilise la CurrentThread propriété pour afficher des informations sur le thread d’application principal, un autre thread de premier plan, un thread d’arrière-plan et un thread de pool de threads.

using System;
using System.Threading;

public class Example
{
   static Object obj = new Object();
   
   public static void Main()
   {
      ThreadPool.QueueUserWorkItem(ShowThreadInformation);
      var th1 = new Thread(ShowThreadInformation);
      th1.Start();
      var th2 = new Thread(ShowThreadInformation);
      th2.IsBackground = true;
      th2.Start();
      Thread.Sleep(500);
      ShowThreadInformation(null); 
   }
   
   private static void ShowThreadInformation(Object state)
   {
      lock (obj) {
         var th  = Thread.CurrentThread;
         Console.WriteLine("Managed thread #{0}: ", th.ManagedThreadId);
         Console.WriteLine("   Background thread: {0}", th.IsBackground);
         Console.WriteLine("   Thread pool thread: {0}", th.IsThreadPoolThread);
         Console.WriteLine("   Priority: {0}", th.Priority);
         Console.WriteLine("   Culture: {0}", th.CurrentCulture.Name);
         Console.WriteLine("   UI culture: {0}", th.CurrentUICulture.Name);
         Console.WriteLine();
      }   
   }
}
// The example displays output like the following:
//       Managed thread #6:
//          Background thread: True
//          Thread pool thread: False
//          Priority: Normal
//          Culture: en-US
//          UI culture: en-US
//       
//       Managed thread #3:
//          Background thread: True
//          Thread pool thread: True
//          Priority: Normal
//          Culture: en-US
//          UI culture: en-US
//       
//       Managed thread #4:
//          Background thread: False
//          Thread pool thread: False
//          Priority: Normal
//          Culture: en-US
//          UI culture: en-US
//       
//       Managed thread #1:
//          Background thread: False
//          Thread pool thread: False
//          Priority: Normal
//          Culture: en-US
//          UI culture: en-US
Imports System.Threading

Module Example
   Private lock As New Object()
                    
   Public Sub Main()
      ThreadPool.QueueUserWorkItem(AddressOf ShowThreadInformation)
      Dim th1 As New Thread(AddressOf ShowThreadInformation)
      th1.Start()
      Dim th2 As New Thread(AddressOf ShowThreadInformation)
      th2.IsBackground = True
      th2.Start()
      Thread.Sleep(500)
      ShowThreadInformation(Nothing) 
   End Sub
   
   Private Sub ShowThreadInformation(state As Object)
      SyncLock lock
         Dim th As Thread = Thread.CurrentThread
         Console.WriteLine("Managed thread #{0}: ", th.ManagedThreadId)
         Console.WriteLine("   Background thread: {0}", th.IsBackground)
         Console.WriteLine("   Thread pool thread: {0}", th.IsThreadPoolThread)
         Console.WriteLine("   Priority: {0}", th.Priority)
         Console.WriteLine("   Culture: {0}", th.CurrentCulture.Name)
         Console.WriteLine("   UI culture: {0}", th.CurrentUICulture.Name)
         Console.WriteLine()
      End SyncLock
   End Sub
End Module
' The example displays output like the following:
'       ' Managed thread #6:
'          Background thread: True
'          Thread pool thread: False
'          Priority: Normal
'          Culture: en-US
'          UI culture: en-US
'       
'       Managed thread #3:
'          Background thread: True
'          Thread pool thread: True
'          Priority: Normal
'          Culture: en-US
'          UI culture: en-US
'       
'       Managed thread #4:
'          Background thread: False
'          Thread pool thread: False
'          Priority: Normal
'          Culture: en-US
'          UI culture: en-US
'       
'       Managed thread #1:
'          Background thread: False
'          Thread pool thread: False
'          Priority: Normal
'          Culture: en-US
'          UI culture: en-US

Threads de premier plan et d’arrière-plan

Les instances de la Thread classe représentent les threads de premier plan ou d’arrière-plan. Les threads d’arrière-plan sont identiques aux threads de premier plan, à une exception près : un thread d’arrière-plan ne maintient pas un processus en cours d’exécution si tous les threads de premier plan sont Une fois que tous les threads de premier plan ont été arrêtés, le runtime arrête tous les threads d’arrière-plan et s’arrête.

Par défaut, les threads suivants s’exécutent au premier plan :

  • Thread d’application principal.

  • Tous les threads créés en appelant un Thread constructeur de classe.

Les threads suivants s’exécutent en arrière-plan par défaut :

  • Threads de pool de threads, qui sont un pool de threads de travail gérés par le Runtime. Vous pouvez configurer le pool de threads et planifier le travail sur les threads de pool de threads à l’aide de la ThreadPool classe.

    Notes

    Les opérations asynchrones basées sur des tâches s’exécutent automatiquement sur des threads de pool de threads. Les opérations asynchrones basées sur des tâches utilisent les Task Task<TResult> classes et pour implémenter le modèle asynchrone basé sur les tâches.

  • Tous les threads qui entrent dans l’environnement d’exécution managé à partir du code non managé.

Vous pouvez modifier un thread pour qu’il s’exécute en arrière-plan en définissant la IsBackground propriété à tout moment. Les threads d’arrière-plan sont utiles pour toute opération qui doit se poursuivre tant qu’une application est en cours d’exécution, mais ne doit pas empêcher l’application de se terminer, telle que la surveillance des modifications du système de fichiers ou des connexions de socket entrantes.

L’exemple suivant illustre la différence entre les threads de premier plan et d’arrière-plan. Elle est similaire au premier exemple de la section démarrage d’un thread , à ceci près qu’elle définit le thread pour s’exécuter en arrière-plan avant de le démarrer. Comme le montre la sortie, la boucle est interrompue avant d’être exécutée pendant cinq secondes.

using System;
using System.Diagnostics;
using System.Threading;

public class Example
{
   public static void Main()
   {
      var th = new Thread(ExecuteInForeground);
      th.IsBackground = true;
      th.Start();
      Thread.Sleep(1000);
      Console.WriteLine("Main thread ({0}) exiting...",
                        Thread.CurrentThread.ManagedThreadId);
   }

   private static void ExecuteInForeground()
   {
      var sw = Stopwatch.StartNew();
      Console.WriteLine("Thread {0}: {1}, Priority {2}",
                        Thread.CurrentThread.ManagedThreadId,
                        Thread.CurrentThread.ThreadState,
                        Thread.CurrentThread.Priority);
      do {
         Console.WriteLine("Thread {0}: Elapsed {1:N2} seconds",
                           Thread.CurrentThread.ManagedThreadId,
                           sw.ElapsedMilliseconds / 1000.0);
         Thread.Sleep(500);
      } while (sw.ElapsedMilliseconds <= 5000);
      sw.Stop();
   }
}
// The example displays output like the following:
//       Thread 3: Background, Priority Normal
//       Thread 3: Elapsed 0.00 seconds
//       Thread 3: Elapsed 0.51 seconds
//       Main thread (1) exiting...
Imports System.Diagnostics
Imports System.Threading

Module Example
   Public Sub Main()
      Dim th As New Thread(AddressOf ExecuteInForeground)
      th.IsBackground = True
      th.Start()
      Thread.Sleep(1000)
      Console.WriteLine("Main thread ({0}) exiting...", Thread.CurrentThread.ManagedThreadId) 
   End Sub
   
   Private Sub ExecuteInForeground()
      Dim start As DateTime = DateTime.Now
      Dim sw As Stopwatch = Stopwatch.StartNew()
      Console.WriteLine("Thread {0}: {1}, Priority {2}", 
                        Thread.CurrentThread.ManagedThreadId,
                        Thread.CurrentThread.ThreadState,
                        Thread.CurrentThread.Priority)
      Do 
         Console.WriteLine("Thread {0}: Elapsed {1:N2} seconds", 
                           Thread.CurrentThread.ManagedThreadId,
                           sw.ElapsedMilliseconds / 1000)
         Thread.Sleep(500)
      Loop While sw.ElapsedMilliseconds <= 5000
      sw.Stop() 
   End Sub
End Module
' The example displays output like the following:
'       Thread 3: Background, Priority Normal
'       Thread 3: Elapsed 0.00 seconds
'       Thread 3: Elapsed 0.51 seconds
'       Main thread (1) exiting...

Culture et threads

Chaque thread a une culture, représentée par la CurrentCulture propriété et une culture d’interface utilisateur, représentée par la CurrentUICulture propriété. La culture actuelle prend en charge les opérations dépendantes de la culture, telles que l’analyse et la mise en forme, la comparaison et le tri de chaînes, et contrôle également le système d’écriture et le calendrier utilisés par un thread. La culture d’interface utilisateur actuelle fournit la récupération dépendante de la culture des ressources dans les fichiers de ressources.

Important

Les CurrentCulture CurrentUICulture Propriétés et ne fonctionnent pas de façon fiable lorsqu’elles sont utilisées avec un thread autre que le thread actuel. dans .NET Framework, la lecture de ces propriétés est fiable, même si la définition de ces propriétés pour un thread autre que le thread actuel n’est pas. Sur .NET Core, une InvalidOperationException exception est levée si un thread tente de lire ou d’écrire ces propriétés sur un thread différent. Nous vous recommandons d’utiliser les CultureInfo.CurrentCulture CultureInfo.CurrentUICulture Propriétés et pour récupérer et définir la culture actuelle.

Lorsqu’un nouveau thread est instancié, sa culture et sa culture d’interface utilisateur sont définies par la culture système actuelle et la culture d’interface utilisateur, et non par la culture et la culture d’interface utilisateur du thread à partir duquel le nouveau thread est créé. Cela signifie, par exemple, que si la culture système actuelle est anglais (États-Unis) et que la culture actuelle du thread d’application principal est le français (France), la culture d’un nouveau thread créé en appelant le Thread(ParameterizedThreadStart) constructeur à partir du thread principal est l’anglais (États-Unis) et non français (France). Pour plus d’informations, consultez la section « culture et threads » de la rubrique de la CultureInfo classe.

Important

cela n’est pas vrai pour les threads qui exécutent des opérations asynchrones pour les applications qui ciblent le .NET Framework 4,6 et versions ultérieures. dans ce cas, la culture et la culture d’interface utilisateur font partie d’un contexte d’opérations asynchrones ; le thread sur lequel une opération asynchrone s’exécute par défaut hérite de la culture et de la culture d’interface utilisateur du thread à partir duquel Pour plus d'informations, consultez la section « Culture et opérations asynchrones basées sur les tâches » de la rubrique relative à la classe CultureInfo.

Vous pouvez effectuer l’une des opérations suivantes pour vous assurer que tous les threads qui s’exécutent dans une application partagent la même culture et la même culture d’interface utilisateur :

Pour plus d’informations et d’exemples, consultez la section « culture et threads » de la rubrique de la CultureInfo classe.

Obtention d’informations sur et le contrôle des threads

Vous pouvez récupérer un certain nombre de valeurs de propriétés qui fournissent des informations sur un thread. Dans certains cas, vous pouvez également définir ces valeurs de propriété pour contrôler le fonctionnement du thread. Ces propriétés de thread sont les suivantes :

  • Nom. Name est une propriété en écriture seule que vous pouvez utiliser pour identifier un thread. Sa valeur par défaut est null.

  • Code de hachage que vous pouvez récupérer en appelant la GetHashCode méthode. Le code de hachage peut être utilisé pour identifier un thread de manière unique ; pour la durée de vie de votre thread, son code de hachage n’entrera pas en conflit avec la valeur de tout autre thread, quel que soit le domaine d’application à partir duquel vous obtenez la valeur.

  • ID de thread. La valeur de la propriété en lecture seule ManagedThreadId est affectée par le runtime et identifie de façon unique un thread dans son processus.

    Notes

    Un ID de thread de système d'exploitation n'est pas lié de manière fixe à un thread managé, car un hôte non managé peut contrôler la relation entre les threads managés et les threads non managés. Plus précisément, un hôte élaboré peut utiliser l' API d’hébergement CLR pour planifier de nombreux threads managés par rapport au même thread de système d’exploitation, ou pour déplacer un thread managé entre différents threads de système d’exploitation.

  • État actuel du thread. Pour la durée de son existence, un thread se trouve toujours dans un ou plusieurs des États définis par la ThreadState propriété.

  • Niveau de priorité de planification, qui est défini par la ThreadPriority propriété. Bien que vous puissiez définir cette valeur pour demander la priorité d’un thread, il n’est pas garanti qu’il soit respecté par le système d’exploitation.

  • Propriété en lecture seule IsThreadPoolThread , qui indique si un thread est un thread de pool de threads.

  • La propriété IsBackground. Pour plus d’informations, consultez la section threads de premier plan et d’arrière-plan .

Constructeurs

Thread(ParameterizedThreadStart)

Initialise une nouvelle instance de la classe Thread, en spécifiant un délégué qui permet à un objet d'être passé au thread quand le thread est démarré.

Thread(ParameterizedThreadStart, Int32)

Initialise une nouvelle instance de la classe Thread, en spécifiant un délégué qui permet à un objet d'être passé au thread quand le thread est démarré et en spécifiant la taille de pile maximale pour le thread.

Thread(ThreadStart)

Initialise une nouvelle instance de la classe Thread.

Thread(ThreadStart, Int32)

Initialise une nouvelle instance de la classe Thread, en spécifiant la taille de pile maximale pour le thread.

Propriétés

ApartmentState
Obsolète.
Obsolète.
Obsolète.

Obtient ou définit l'état de cloisonnement de ce thread.

CurrentContext

Obtient le contexte actuel dans lequel le thread s'exécute.

CurrentCulture

Obtient ou définit la culture du thread actuel.

CurrentPrincipal

Obtient ou définit le principal actuel du thread (pour une sécurité basée sur les rôles).

CurrentThread

Obtient le thread en cours d'exécution.

CurrentUICulture

Obtient ou définit la culture actuelle utilisée par le Gestionnaire de ressources pour rechercher des ressources spécifiques à la culture au moment de l'exécution.

ExecutionContext

Obtient un objet ExecutionContext qui contient des informations relatives aux divers contextes du thread actuel.

IsAlive

Obtient une valeur indiquant l'état de l'exécution du thread actuel.

IsBackground

Obtient ou définit une valeur indiquant si le thread est un thread d'arrière-plan ou non.

IsThreadPoolThread

Obtient une valeur indiquant si un thread appartient au pool de threads managés ou non.

ManagedThreadId

Obtient un identificateur unique pour le thread managé actuel.

Name

Obtient ou définit le nom du thread.

Priority

Obtient ou définit une valeur indiquant la priorité de planification d'un thread.

ThreadState

Obtient une valeur contenant les états du thread actuel.

Méthodes

Abort()
Obsolète.

Déclenche ThreadAbortException dans le thread sur lequel l'appel a lieu pour commencer le processus d'arrêt du thread. L'appel de cette méthode arrête généralement le thread.

Abort(Object)
Obsolète.

Déclenche une ThreadAbortException dans le thread sur lequel l'appel a lieu pour commencer le processus d'arrêt du thread, tout en fournissant des informations sur les exceptions relatives à l'arrêt du thread. L'appel de cette méthode arrête généralement le thread.

AllocateDataSlot()

Alloue sur tous les threads un emplacement de données sans nom. Pour de meilleures performances, utilisez à la place les champs marqués avec l'attribut ThreadStaticAttribute.

AllocateNamedDataSlot(String)

Alloue sur tous les threads un emplacement de données nommé. Pour de meilleures performances, utilisez à la place les champs marqués avec l'attribut ThreadStaticAttribute.

BeginCriticalRegion()

Avertit un hôte que l'exécution est sur le point d'entrer dans une zone de code dans laquelle les effets d'un abandon de thread ou d'une exception non gérée peuvent compromettre d'autres tâches dans le domaine d'application.

BeginThreadAffinity()

Avertit un hôte que le code managé est sur le point d'exécuter des instructions qui dépendent de l'identité du thread du système d'exploitation physique actuel.

DisableComObjectEagerCleanup()

Désactive le nettoyage automatique des wrappers RCW (Runtime Callable Wrapper) pour le thread actuel.

EndCriticalRegion()

Avertit un hôte que l’exécution est sur le point d’entrer dans une zone de code dans laquelle les effets d’un abandon de thread ou d’une exception non gérée sont limités à la tâche actuelle.

EndThreadAffinity()

Avertit un hôte que le code managé a terminé l'exécution des instructions qui dépendent de l'identité du thread du système d'exploitation physique actuel.

Equals(Object)

Détermine si l'objet spécifié est égal à l'objet actuel.

(Hérité de Object)
Finalize()

Vérifie que les ressources sont libérées et que toute autre opération de nettoyage est effectuée quand le garbage collector récupère l'objet Thread.

FreeNamedDataSlot(String)

Élimine l'association entre un nom et un emplacement pour tous les threads du processus. Pour de meilleures performances, utilisez à la place les champs marqués avec l'attribut ThreadStaticAttribute.

GetApartmentState()

Retourne une valeur ApartmentState qui indique l'état de cloisonnement.

GetCompressedStack()
Obsolète.
Obsolète.

Retourne un objet CompressedStack qui peut être utilisé pour capturer la pile pour le thread actuel.

GetCurrentProcessorId()

Obtient un ID utilisé pour indiquer le processeur sur lequel le thread actuel s’exécute.

GetData(LocalDataStoreSlot)

Récupère la valeur de l'emplacement spécifié sur le thread actif, dans le domaine actuel du thread actif. Pour de meilleures performances, utilisez à la place les champs marqués avec l'attribut ThreadStaticAttribute.

GetDomain()

Retourne le domaine actuel dans lequel le thread actif est en cours d'exécution.

GetDomainID()

Retourne un identificateur unique de domaine d'application.

GetHashCode()

Retourne un code de hachage pour le thread actuel.

GetHashCode()

Fait office de fonction de hachage par défaut.

(Hérité de Object)
GetNamedDataSlot(String)

Recherche un emplacement de données nommé. Pour de meilleures performances, utilisez à la place les champs marqués avec l'attribut ThreadStaticAttribute.

GetType()

Obtient le Type de l'instance actuelle.

(Hérité de Object)
Interrupt()

Interrompt un thread dont l'état est WaitSleepJoin.

Join()

Bloque le thread appelant jusqu’à ce que le thread représenté par cette instance s’arrête, tout en continuant d’exécuter le pompage COM et SendMessage standard.

Join(Int32)

Bloque le thread appelant jusqu'à ce que le thread représenté par cette instance s'arrête ou que la durée spécifiée soit écoulée, tout en continuant d'exécuter le pompage COM et SendMessage standard.

Join(TimeSpan)

Bloque le thread appelant jusqu'à ce que le thread représenté par cette instance s'arrête ou que la durée spécifiée soit écoulée, tout en continuant d'exécuter le pompage COM et SendMessage standard.

MemberwiseClone()

Crée une copie superficielle du Object actuel.

(Hérité de Object)
MemoryBarrier()

Synchronise l'accès à la mémoire comme suit : le processeur qui exécute le thread actuel ne peut pas réorganiser les instructions de sorte que les accès à la mémoire antérieurs à l'appel de MemoryBarrier() s'exécutent après les accès à la mémoire postérieurs à l'appel de MemoryBarrier().

ResetAbort()
Obsolète.

Annule un Abort(Object) demandé pour le thread actuel.

Resume()
Obsolète.
Obsolète.
Obsolète.

Reprend un thread qui a été suspendu.

SetApartmentState(ApartmentState)

Définit l'état de cloisonnement d'un thread avant qu'il ne soit démarré.

SetCompressedStack(CompressedStack)
Obsolète.
Obsolète.

Applique une CompressedStack capturée au thread actuel.

SetData(LocalDataStoreSlot, Object)

Définit les données dans l'emplacement spécifié sur le thread en cours d'exécution, pour le domaine actuel de ce thread. Pour de meilleures performances, utilisez à la place les champs marqués avec l'attribut ThreadStaticAttribute.

Sleep(Int32)

Suspend le thread actuel pendant le nombre spécifié de millisecondes.

Sleep(TimeSpan)

Suspend le thread actuel pendant la durée spécifiée.

SpinWait(Int32)

Provoque l'attente d'un thread pendant le nombre de fois défini par le paramètre iterations.

Start()

Provoque le changement, par le système d'exploitation, de l'état de l'instance actuelle en Running.

Start(Object)

Provoque le changement, par le système d'exploitation, de l'état de l'instance actuelle en Running, et fournit éventuellement un objet contenant les données que la méthode exécutée par le thread doit utiliser.

Suspend()
Obsolète.
Obsolète.
Obsolète.

Suspend le thread ou, s'il est déjà suspendu, n'a aucun effet.

ToString()

Retourne une chaîne qui représente l'objet actuel.

(Hérité de Object)
TrySetApartmentState(ApartmentState)

Définit l'état de cloisonnement d'un thread avant qu'il ne soit démarré.

UnsafeStart()

Provoque le changement, par le système d'exploitation, de l'état de l'instance actuelle en Running.

UnsafeStart(Object)

Provoque le changement, par le système d'exploitation, de l'état de l'instance actuelle en Running, et fournit éventuellement un objet contenant les données que la méthode exécutée par le thread doit utiliser.

VolatileRead(Byte)

Lit la valeur d'un champ. Sur les systèmes le nécessitant, insère une barrière de mémoire qui empêche le processeur de réorganiser les opérations de mémoire comme suit : si une opération de lecture ou d'écriture apparaît après cette méthode dans le code, le processeur ne peut pas la déplacer avant cette méthode.

VolatileRead(Double)

Lit la valeur d'un champ. Sur les systèmes le nécessitant, insère une barrière de mémoire qui empêche le processeur de réorganiser les opérations de mémoire comme suit : si une opération de lecture ou d'écriture apparaît après cette méthode dans le code, le processeur ne peut pas la déplacer avant cette méthode.

VolatileRead(Int16)

Lit la valeur d'un champ. Sur les systèmes le nécessitant, insère une barrière de mémoire qui empêche le processeur de réorganiser les opérations de mémoire comme suit : si une opération de lecture ou d'écriture apparaît après cette méthode dans le code, le processeur ne peut pas la déplacer avant cette méthode.

VolatileRead(Int32)

Lit la valeur d'un champ. Sur les systèmes le nécessitant, insère une barrière de mémoire qui empêche le processeur de réorganiser les opérations de mémoire comme suit : si une opération de lecture ou d'écriture apparaît après cette méthode dans le code, le processeur ne peut pas la déplacer avant cette méthode.

VolatileRead(Int64)

Lit la valeur d'un champ. Sur les systèmes le nécessitant, insère une barrière de mémoire qui empêche le processeur de réorganiser les opérations de mémoire comme suit : si une opération de lecture ou d'écriture apparaît après cette méthode dans le code, le processeur ne peut pas la déplacer avant cette méthode.

VolatileRead(IntPtr)

Lit la valeur d'un champ. Sur les systèmes le nécessitant, insère une barrière de mémoire qui empêche le processeur de réorganiser les opérations de mémoire comme suit : si une opération de lecture ou d'écriture apparaît après cette méthode dans le code, le processeur ne peut pas la déplacer avant cette méthode.

VolatileRead(Object)

Lit la valeur d'un champ. Sur les systèmes le nécessitant, insère une barrière de mémoire qui empêche le processeur de réorganiser les opérations de mémoire comme suit : si une opération de lecture ou d'écriture apparaît après cette méthode dans le code, le processeur ne peut pas la déplacer avant cette méthode.

VolatileRead(SByte)

Lit la valeur d'un champ. Sur les systèmes le nécessitant, insère une barrière de mémoire qui empêche le processeur de réorganiser les opérations de mémoire comme suit : si une opération de lecture ou d'écriture apparaît après cette méthode dans le code, le processeur ne peut pas la déplacer avant cette méthode.

VolatileRead(Single)

Lit la valeur d'un champ. Sur les systèmes le nécessitant, insère une barrière de mémoire qui empêche le processeur de réorganiser les opérations de mémoire comme suit : si une opération de lecture ou d'écriture apparaît après cette méthode dans le code, le processeur ne peut pas la déplacer avant cette méthode.

VolatileRead(UInt16)

Lit la valeur d'un champ. Sur les systèmes le nécessitant, insère une barrière de mémoire qui empêche le processeur de réorganiser les opérations de mémoire comme suit : si une opération de lecture ou d'écriture apparaît après cette méthode dans le code, le processeur ne peut pas la déplacer avant cette méthode.

VolatileRead(UInt32)

Lit la valeur d'un champ. Sur les systèmes le nécessitant, insère une barrière de mémoire qui empêche le processeur de réorganiser les opérations de mémoire comme suit : si une opération de lecture ou d'écriture apparaît après cette méthode dans le code, le processeur ne peut pas la déplacer avant cette méthode.

VolatileRead(UInt64)

Lit la valeur d'un champ. Sur les systèmes le nécessitant, insère une barrière de mémoire qui empêche le processeur de réorganiser les opérations de mémoire comme suit : si une opération de lecture ou d'écriture apparaît après cette méthode dans le code, le processeur ne peut pas la déplacer avant cette méthode.

VolatileRead(UIntPtr)

Lit la valeur d'un champ. Sur les systèmes le nécessitant, insère une barrière de mémoire qui empêche le processeur de réorganiser les opérations de mémoire comme suit : si une opération de lecture ou d'écriture apparaît après cette méthode dans le code, le processeur ne peut pas la déplacer avant cette méthode.

VolatileWrite(Byte, Byte)

Écrit une valeur dans un champ. Sur les systèmes le nécessitant, insère une barrière de mémoire qui empêche le processeur de réorganiser les opérations de mémoire comme suit : si une opération de lecture ou d'écriture apparaît avant cette méthode dans le code, le processeur ne peut pas la déplacer après cette méthode.

VolatileWrite(Double, Double)

Écrit une valeur dans un champ. Sur les systèmes le nécessitant, insère une barrière de mémoire qui empêche le processeur de réorganiser les opérations de mémoire comme suit : si une opération de lecture ou d'écriture apparaît avant cette méthode dans le code, le processeur ne peut pas la déplacer après cette méthode.

VolatileWrite(Int16, Int16)

Écrit une valeur dans un champ. Sur les systèmes le nécessitant, insère une barrière de mémoire qui empêche le processeur de réorganiser les opérations de mémoire comme suit : si une opération de lecture ou d'écriture apparaît avant cette méthode dans le code, le processeur ne peut pas la déplacer après cette méthode.

VolatileWrite(Int32, Int32)

Écrit une valeur dans un champ. Sur les systèmes le nécessitant, insère une barrière de mémoire qui empêche le processeur de réorganiser les opérations de mémoire comme suit : si une opération de lecture ou d'écriture apparaît avant cette méthode dans le code, le processeur ne peut pas la déplacer après cette méthode.

VolatileWrite(Int64, Int64)

Écrit une valeur dans un champ. Sur les systèmes le nécessitant, insère une barrière de mémoire qui empêche le processeur de réorganiser les opérations de mémoire comme suit : si une opération de lecture ou d'écriture apparaît avant cette méthode dans le code, le processeur ne peut pas la déplacer après cette méthode.

VolatileWrite(IntPtr, IntPtr)

Écrit une valeur dans un champ. Sur les systèmes le nécessitant, insère une barrière de mémoire qui empêche le processeur de réorganiser les opérations de mémoire comme suit : si une opération de lecture ou d'écriture apparaît avant cette méthode dans le code, le processeur ne peut pas la déplacer après cette méthode.

VolatileWrite(Object, Object)

Écrit une valeur dans un champ. Sur les systèmes le nécessitant, insère une barrière de mémoire qui empêche le processeur de réorganiser les opérations de mémoire comme suit : si une opération de lecture ou d'écriture apparaît avant cette méthode dans le code, le processeur ne peut pas la déplacer après cette méthode.

VolatileWrite(SByte, SByte)

Écrit une valeur dans un champ. Sur les systèmes le nécessitant, insère une barrière de mémoire qui empêche le processeur de réorganiser les opérations de mémoire comme suit : si une opération de lecture ou d'écriture apparaît avant cette méthode dans le code, le processeur ne peut pas la déplacer après cette méthode.

VolatileWrite(Single, Single)

Écrit une valeur dans un champ. Sur les systèmes le nécessitant, insère une barrière de mémoire qui empêche le processeur de réorganiser les opérations de mémoire comme suit : si une opération de lecture ou d'écriture apparaît avant cette méthode dans le code, le processeur ne peut pas la déplacer après cette méthode.

VolatileWrite(UInt16, UInt16)

Écrit une valeur dans un champ. Sur les systèmes le nécessitant, insère une barrière de mémoire qui empêche le processeur de réorganiser les opérations de mémoire comme suit : si une opération de lecture ou d'écriture apparaît avant cette méthode dans le code, le processeur ne peut pas la déplacer après cette méthode.

VolatileWrite(UInt32, UInt32)

Écrit une valeur dans un champ. Sur les systèmes le nécessitant, insère une barrière de mémoire qui empêche le processeur de réorganiser les opérations de mémoire comme suit : si une opération de lecture ou d'écriture apparaît avant cette méthode dans le code, le processeur ne peut pas la déplacer après cette méthode.

VolatileWrite(UInt64, UInt64)

Écrit une valeur dans un champ. Sur les systèmes le nécessitant, insère une barrière de mémoire qui empêche le processeur de réorganiser les opérations de mémoire comme suit : si une opération de lecture ou d'écriture apparaît avant cette méthode dans le code, le processeur ne peut pas la déplacer après cette méthode.

VolatileWrite(UIntPtr, UIntPtr)

Écrit une valeur dans un champ. Sur les systèmes le nécessitant, insère une barrière de mémoire qui empêche le processeur de réorganiser les opérations de mémoire comme suit : si une opération de lecture ou d'écriture apparaît avant cette méthode dans le code, le processeur ne peut pas la déplacer après cette méthode.

Yield()

Oblige le thread appelant à céder l'exécution à un autre thread prêt à s'exécuter sur le processeur actuel. Le système d'exploitation sélectionne le thread auquel l'exécution doit être cédée.

Implémentations d’interfaces explicites

_Thread.GetIDsOfNames(Guid, IntPtr, UInt32, UInt32, IntPtr)

Mappe un jeu de noms avec un jeu correspondant d'identificateurs de dispatch.

_Thread.GetTypeInfo(UInt32, UInt32, IntPtr)

Récupère les informations de type pour un objet, qui peuvent être utilisées ensuite pour obtenir les informations de type d'une interface.

_Thread.GetTypeInfoCount(UInt32)

Récupère le nombre d'interfaces d'informations de type fourni par un objet (0 ou 1).

_Thread.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr)

Fournit l'accès aux propriétés et aux méthodes exposées par un objet.

S’applique à

Cohérence de thread

Ce type est thread-safe.

Voir aussi