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
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
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 la fonctionnalité de threading simple.

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();
    }
}
open System.Threading

// Simple threading scenario:  Start a static method running
// on a second thread.

// 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.
let threadProc () =
    for i = 0 to 9 do
        printfn $"ThreadProc: {i}"
        // Yield the rest of the time slice.
        Thread.Sleep 0

printfn "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. F# simplifies the creation of this delegate.
let t = Thread 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 _ = 0 to 3 do
    printfn "Main thread: Do some work."
    Thread.Sleep 0

printfn "Main thread: Call Join(), to wait until ThreadProc ends."
t.Join()
printfn "Main thread: ThreadProc.Join has returned.  Press Enter to end program."
stdin.ReadLine() |> ignore
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

La Thread classe crée et contrôle un thread, définit sa priorité et obtient son état.

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

Démarrer 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 de délégués, selon que vous pouvez ou non transmettre un argument à la méthode à exécuter :

  • Si la méthode n’a aucun argument, vous passez un ThreadStart délégué au constructeur. Il a la signature :

    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 la moitié d’une seconde et affiche le nombre écoulé de secondes. Lorsque le thread a été exécuté pendant au moins cinq secondes, la boucle se termine et le thread met fin à 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
    
    open System.Diagnostics
    open System.Threading
    
    let executeInForeground () =
        let sw = Stopwatch.StartNew()
    
        printfn $"Thread {Thread.CurrentThread.ManagedThreadId}: {Thread.CurrentThread.ThreadState}, Priority {Thread.CurrentThread.Priority}"
    
        while sw.ElapsedMilliseconds <= 5000 do
            printfn $"Thread {Thread.CurrentThread.ManagedThreadId}: Elapsed {sw.ElapsedMilliseconds / 1000L:N2} seconds"
            Thread.Sleep 500
    
        sw.Stop()
    
    let th = Thread executeInForeground
    th.Start()
    Thread.Sleep 1000
    printfn $"Main thread ({Thread.CurrentThread.ManagedThreadId}) exiting..."
    
    // 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 Example3
        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 passez un ParameterizedThreadStart délégué au constructeur. Il a la signature :

    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 en type approprié.

    L’exemple suivant est identique à celui précédent, sauf 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 que la boucle doit 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
    
    open System
    open System.Diagnostics
    open System.Threading
    
    let executeInForeground obj =
        let interval =
            try
                unbox<int> obj
            with :? InvalidCastException ->
                5000
    
        let sw = Stopwatch.StartNew()
    
        printfn $"Thread {Thread.CurrentThread.ManagedThreadId}: {Thread.CurrentThread.ThreadState}, Priority {Thread.CurrentThread.Priority}"
    
        while sw.ElapsedMilliseconds <= interval do
            printfn $"Thread {Thread.CurrentThread.ManagedThreadId}: Elapsed {sw.ElapsedMilliseconds / 1000L:N2} seconds"
            Thread.Sleep 500
    
        sw.Stop()
    
    let th = Thread(ParameterizedThreadStart executeInForeground)
    th.Start 4500
    Thread.Sleep 1000
    printfn $"Main thread ({Thread.CurrentThread.ManagedThreadId}) exiting..."
    
    // 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 Example4
        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 thread soit terminée.

Récupérer des objets Thread

Vous pouvez utiliser la propriété statique (Shared en Visual Basic) CurrentThread pour récupérer une référence au thread en cours d’exécution à partir du code que le thread exécute. 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
open System.Threading

let obj = obj ()

let showThreadInformation (state: obj) =
    lock obj (fun () ->
        let th = Thread.CurrentThread
        printfn $"Managed thread #{th.ManagedThreadId}: "
        printfn $"   Background thread: {th.IsBackground}"
        printfn $"   Thread pool thread: {th.IsThreadPoolThread}"
        printfn $"   Priority: {th.Priority}"
        printfn $"   Culture: {th.CurrentCulture.Name}"
        printfn $"   UI culture: {th.CurrentUICulture.Name}"
        printfn "")

ThreadPool.QueueUserWorkItem showThreadInformation |> ignore
let th1 = Thread(ParameterizedThreadStart showThreadInformation)
th1.Start()
let th2 = Thread(ParameterizedThreadStart showThreadInformation)
th2.IsBackground <- true
th2.Start()
Thread.Sleep 500
showThreadInformation ()

// 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 Example2
    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 des threads de premier plan ou des threads d’arrière-plan. Les threads d’arrière-plan sont identiques aux threads de premier plan avec une exception : un thread d’arrière-plan ne conserve pas un processus en cours d’exécution si tous les threads de premier plan se sont arrêtés. 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 du pool de threads, qui proviennent d’un pool de threads de travail gérés par l’environnement d’exécution. Vous pouvez configurer le pool de threads et planifier le travail dans les threads du pool en utilisant la classe ThreadPool.

    Note

    Les opérations asynchrones basées sur des tâches s’exécutent automatiquement sur les threads du pool de threads. Les opérations asynchrones basées sur des tâches utilisent les classes Task et Task<TResult> pour implémenter le modèle asynchrone axé 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 à exécuter 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 continuer tant qu’une application est en cours d’exécution, mais ne doit pas empêcher l’application de se terminer, comme la surveillance des modifications apportées au 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. C’est comme le premier exemple de la section Démarrer un thread , sauf qu’il définit le thread à exécuter en arrière-plan avant de le démarrer. Comme le montre la sortie, la boucle est interrompue avant qu’elle ne s’exécute 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...
open System.Diagnostics
open System.Threading

let executeInForeground () =
    let sw = Stopwatch.StartNew()
    printfn $"Thread {Thread.CurrentThread.ManagedThreadId}: {Thread.CurrentThread.ThreadState}, Priority {Thread.CurrentThread.Priority}"
    while sw.ElapsedMilliseconds <= 5000 do
        printfn $"Thread {Thread.CurrentThread.ManagedThreadId}: Elapsed {sw.ElapsedMilliseconds / 1000L:N2} seconds"
        Thread.Sleep 500
    sw.Stop()

let th = Thread executeInForeground
th.IsBackground <- true
th.Start()
Thread.Sleep 1000
printfn $"Main thread ({Thread.CurrentThread.ManagedThreadId}) exiting..."

// 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 Example1
    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 sensibles à la culture, telles que l’analyse et le formatage, la comparaison de chaînes et le tri, et contrôle également le système d’écriture et le calendrier utilisés par un thread. La culture IU actuelle fournit une récupération sensible à la culture des ressources dans les fichiers de ressources.

Important

Les CurrentCulture propriétés et CurrentUICulture ne fonctionnent pas de manière fiable lorsqu’elles sont utilisées avec un thread autre que le thread actuel. Une InvalidOperationException exception est levée si un thread tente de lire ou d’écrire ces propriétés sur un autre thread. Nous vous recommandons d’utiliser les propriétés CultureInfo.CurrentCulture et CultureInfo.CurrentUICulture 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 de l’interface utilisateur, et non par la culture de culture et d’interface utilisateur du thread à partir duquel le nouveau thread est créé. Cela signifie, par exemple, que si la culture système actuelle est l’anglais (États-Unis) et que la culture actuelle du thread d’application principal est française (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 le français (France). Pour plus d’informations, consultez la section « Culture et threads » de la rubrique sur la classe CultureInfo .

Important

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

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 » des remarques sur la classe CultureInfo.

Obtenir des informations sur et contrôler les threads

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

  • Un nom. Name est une propriété à écriture unique 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’entre pas en collision avec la valeur d’un 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 manière unique un thread au sein de son processus.

    Note

    Un ThreadId de système d’exploitation n’a aucune relation fixe avec un thread managé, car un hôte non managé peut contrôler la relation entre les threads managés et non managés. Plus précisément, un hôte sophistiqué peut utiliser l’API d’hébergement CLR pour planifier de nombreux threads managés sur le 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. Pendant la durée de son existence, un thread se trouve toujours dans un ou plusieurs états définis par la ThreadState propriété.

  • Niveau de priorité de planification, défini par la ThreadPriority propriété. Bien que vous puissiez définir cette valeur pour demander la priorité d’un thread, elle n’est pas garantie d’être respectée par le système d’exploitation.

  • La propriété IsThreadPoolThread en lecture seule indique si un thread est un thread du pool de threads.

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

Constructeurs

Nom Description
Thread(ParameterizedThreadStart, Int32)

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

Thread(ParameterizedThreadStart)

Initialise une nouvelle instance de la Thread classe, en spécifiant un délégué qui permet à un objet d’être transmis au thread au démarrage du thread.

Thread(ThreadStart, Int32)

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

Thread(ThreadStart)

Initialise une nouvelle instance de la classe Thread.

Propriétés

Nom Description
ApartmentState
Obsolète.
Obsolète.

Obtient ou définit l’état d’appartement 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 la 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 Resource Manager pour rechercher des ressources spécifiques à la culture au moment de l’exécution.

ExecutionContext

Obtient un ExecutionContext objet qui contient des informations sur les différents contextes du thread actuel.

IsAlive

Obtient une valeur indiquant l’état d’exécution du thread actuel.

IsBackground

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

IsThreadPoolThread

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

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

Nom Description
Abort()
Obsolète.

Déclenche un ThreadAbortException thread sur lequel il est appelé pour commencer le processus de fin du thread. L’appel de cette méthode met généralement fin au thread.

Abort(Object)
Obsolète.

Déclenche un ThreadAbortException thread sur lequel il est appelé, pour commencer le processus de fin du thread tout en fournissant des informations d’exception sur l’arrêt du thread. L’appel de cette méthode met généralement fin au thread.

AllocateDataSlot()

Alloue un emplacement de données sans nom sur tous les threads. Pour de meilleures performances, utilisez plutôt des champs marqués avec l’attribut ThreadStaticAttribute .

AllocateNamedDataSlot(String)

Alloue un emplacement de données nommé sur tous les threads. Pour de meilleures performances, utilisez plutôt des champs marqués avec l’attribut ThreadStaticAttribute .

BeginCriticalRegion()

Avertit un hôte que l’exécution est sur le point d’entrer une région de code dans laquelle les effets d’une exception abandonnée ou non gérée peuvent compromettre d’autres tâches dans le domaine de l’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 de système d’exploitation physique actuel.

DisableComObjectEagerCleanup()

Désactive le nettoyage automatique des wrappers pouvant être appelé au runtime (RCW) pour le thread actuel.

EndCriticalRegion()

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

EndThreadAffinity()

Avertit un hôte que le code managé a terminé d’exécuter des instructions qui dépendent de l’identité du thread de 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()

Garantit que les ressources sont libérées et que d’autres opérations de nettoyage sont effectuées lorsque 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 plutôt des champs marqués avec l’attribut ThreadStaticAttribute .

GetApartmentState()

Retourne une ApartmentState valeur indiquant l’état de l’appartement.

GetCompressedStack()
Obsolète.
Obsolète.

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

GetCurrentProcessorId()

Obtient un ID utilisé pour indiquer sur quel processeur le thread actuel est en cours d’exécution.

GetData(LocalDataStoreSlot)

Récupère la valeur de l’emplacement spécifié sur le thread actuel, dans le domaine actuel du thread actuel. Pour de meilleures performances, utilisez plutôt des champs marqués avec l’attribut ThreadStaticAttribute .

GetDomain()

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

GetDomainID()

Retourne un identificateur de domaine d’application unique.

GetHashCode()

Retourne un code de hachage pour le thread actuel.

GetHashCode()

Sert 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 plutôt des champs marqués avec l’attribut ThreadStaticAttribute .

GetType()

Obtient la Type de l’instance actuelle.

(Hérité de Object)
Interrupt()

Interrompt un thread qui se trouve dans l’état du WaitSleepJoin thread.

Join()

Bloque le thread appelant jusqu’à ce que le thread représenté par cette instance se termine, tout en continuant à effectuer des opérations COM et SendMessage de pompe standard.

Join(Int32)

Bloque le thread appelant jusqu’à ce que le thread représenté par cette instance se termine ou que le temps spécifié s’écoule, tout en continuant à effectuer une pompe COM et SendMessage standard.

Join(TimeSpan)

Bloque le thread appelant jusqu’à ce que le thread représenté par cette instance se termine ou que le temps spécifié s’écoule, tout en continuant à effectuer une pompe COM et SendMessage standard.

MemberwiseClone()

Crée une copie superficielle du Objectactuel.

(Hérité de Object)
MemoryBarrier()

Synchronise l’accès à la mémoire comme suit : le processeur exécutant le thread actuel ne peut pas réorganiser les instructions de telle façon que la mémoire accède avant l’appel pour MemoryBarrier() s’exécuter après les accès à la mémoire qui suivent l’appel.MemoryBarrier()

ResetAbort()
Obsolète.

Annule une Abort(Object) demande pour le thread actuel.

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

Reprend un thread qui a été suspendu.

SetApartmentState(ApartmentState)

Définit l’état d’appartement d’un thread avant son démarrage.

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

Applique une capture CompressedStack 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 plutôt des champs marqués avec l’attribut ThreadStaticAttribute .

Sleep(Int32)

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

Sleep(TimeSpan)

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

SpinWait(Int32)

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

Start()

Provoque le changement de l’état de l’instance Runningactuelle par le système d’exploitation.

Start(Object)

Provoque le changement de l’état de l’instance Runningactuelle par le système d’exploitation et fournit éventuellement un objet contenant des données à utiliser par la méthode exécutée par le thread.

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

Suspend le thread, ou si le thread 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 d’appartement d’un thread avant son démarrage.

UnsafeStart()

Provoque le changement de l’état de l’instance Runningactuelle par le système d’exploitation.

UnsafeStart(Object)

Provoque le changement de l’état de l’instance Runningactuelle par le système d’exploitation et fournit éventuellement un objet contenant des données à utiliser par la méthode exécutée par le thread.

VolatileRead(Byte)
Obsolète.

Lit la valeur d’un champ. Sur les systèmes qui en ont besoin, 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 lecture ou une écriture apparaît après cette méthode dans le code, le processeur ne peut pas le déplacer avant cette méthode.

VolatileRead(Double)
Obsolète.

Lit la valeur d’un champ. Sur les systèmes qui en ont besoin, 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 lecture ou une écriture apparaît après cette méthode dans le code, le processeur ne peut pas le déplacer avant cette méthode.

VolatileRead(Int16)
Obsolète.

Lit la valeur d’un champ. Sur les systèmes qui en ont besoin, 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 lecture ou une écriture apparaît après cette méthode dans le code, le processeur ne peut pas le déplacer avant cette méthode.

VolatileRead(Int32)
Obsolète.

Lit la valeur d’un champ. Sur les systèmes qui en ont besoin, 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 lecture ou une écriture apparaît après cette méthode dans le code, le processeur ne peut pas le déplacer avant cette méthode.

VolatileRead(Int64)
Obsolète.

Lit la valeur d’un champ. Sur les systèmes qui en ont besoin, 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 lecture ou une écriture apparaît après cette méthode dans le code, le processeur ne peut pas le déplacer avant cette méthode.

VolatileRead(IntPtr)
Obsolète.

Lit la valeur d’un champ. Sur les systèmes qui en ont besoin, 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 lecture ou une écriture apparaît après cette méthode dans le code, le processeur ne peut pas le déplacer avant cette méthode.

VolatileRead(Object)
Obsolète.

Lit la valeur d’un champ. Sur les systèmes qui en ont besoin, 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 lecture ou une écriture apparaît après cette méthode dans le code, le processeur ne peut pas le déplacer avant cette méthode.

VolatileRead(SByte)
Obsolète.

Lit la valeur d’un champ. Sur les systèmes qui en ont besoin, 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 lecture ou une écriture apparaît après cette méthode dans le code, le processeur ne peut pas le déplacer avant cette méthode.

VolatileRead(Single)
Obsolète.

Lit la valeur d’un champ. Sur les systèmes qui en ont besoin, 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 lecture ou une écriture apparaît après cette méthode dans le code, le processeur ne peut pas le déplacer avant cette méthode.

VolatileRead(UInt16)
Obsolète.

Lit la valeur d’un champ. Sur les systèmes qui en ont besoin, 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 lecture ou une écriture apparaît après cette méthode dans le code, le processeur ne peut pas le déplacer avant cette méthode.

VolatileRead(UInt32)
Obsolète.

Lit la valeur d’un champ. Sur les systèmes qui en ont besoin, 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 lecture ou une écriture apparaît après cette méthode dans le code, le processeur ne peut pas le déplacer avant cette méthode.

VolatileRead(UInt64)
Obsolète.

Lit la valeur d’un champ. Sur les systèmes qui en ont besoin, 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 lecture ou une écriture apparaît après cette méthode dans le code, le processeur ne peut pas le déplacer avant cette méthode.

VolatileRead(UIntPtr)
Obsolète.

Lit la valeur d’un champ. Sur les systèmes qui en ont besoin, 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 lecture ou une écriture apparaît après cette méthode dans le code, le processeur ne peut pas le déplacer avant cette méthode.

VolatileWrite(Byte, Byte)
Obsolète.

Écrit une valeur dans un champ. Sur les systèmes qui en ont besoin, 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 lecture ou une écriture apparaît avant cette méthode dans le code, le processeur ne peut pas le déplacer après cette méthode.

VolatileWrite(Double, Double)
Obsolète.

Écrit une valeur dans un champ. Sur les systèmes qui en ont besoin, 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 lecture ou une écriture apparaît avant cette méthode dans le code, le processeur ne peut pas le déplacer après cette méthode.

VolatileWrite(Int16, Int16)
Obsolète.

Écrit une valeur dans un champ. Sur les systèmes qui en ont besoin, 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 lecture ou une écriture apparaît avant cette méthode dans le code, le processeur ne peut pas le déplacer après cette méthode.

VolatileWrite(Int32, Int32)
Obsolète.

Écrit une valeur dans un champ. Sur les systèmes qui en ont besoin, 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 lecture ou une écriture apparaît avant cette méthode dans le code, le processeur ne peut pas le déplacer après cette méthode.

VolatileWrite(Int64, Int64)
Obsolète.

Écrit une valeur dans un champ. Sur les systèmes qui en ont besoin, 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 lecture ou une écriture apparaît avant cette méthode dans le code, le processeur ne peut pas le déplacer après cette méthode.

VolatileWrite(IntPtr, IntPtr)
Obsolète.

Écrit une valeur dans un champ. Sur les systèmes qui en ont besoin, 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 lecture ou une écriture apparaît avant cette méthode dans le code, le processeur ne peut pas le déplacer après cette méthode.

VolatileWrite(Object, Object)
Obsolète.

Écrit une valeur dans un champ. Sur les systèmes qui en ont besoin, 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 lecture ou une écriture apparaît avant cette méthode dans le code, le processeur ne peut pas le déplacer après cette méthode.

VolatileWrite(SByte, SByte)
Obsolète.

Écrit une valeur dans un champ. Sur les systèmes qui en ont besoin, 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 lecture ou une écriture apparaît avant cette méthode dans le code, le processeur ne peut pas le déplacer après cette méthode.

VolatileWrite(Single, Single)
Obsolète.

Écrit une valeur dans un champ. Sur les systèmes qui en ont besoin, 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 lecture ou une écriture apparaît avant cette méthode dans le code, le processeur ne peut pas le déplacer après cette méthode.

VolatileWrite(UInt16, UInt16)
Obsolète.

Écrit une valeur dans un champ. Sur les systèmes qui en ont besoin, 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 lecture ou une écriture apparaît avant cette méthode dans le code, le processeur ne peut pas le déplacer après cette méthode.

VolatileWrite(UInt32, UInt32)
Obsolète.

Écrit une valeur dans un champ. Sur les systèmes qui en ont besoin, 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 lecture ou une écriture apparaît avant cette méthode dans le code, le processeur ne peut pas le déplacer après cette méthode.

VolatileWrite(UInt64, UInt64)
Obsolète.

Écrit une valeur dans un champ. Sur les systèmes qui en ont besoin, 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 lecture ou une écriture apparaît avant cette méthode dans le code, le processeur ne peut pas le déplacer après cette méthode.

VolatileWrite(UIntPtr, UIntPtr)
Obsolète.

Écrit une valeur dans un champ. Sur les systèmes qui en ont besoin, 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 lecture ou une écriture apparaît avant cette méthode dans le code, le processeur ne peut pas le 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 à générer.

Implémentations d’interfaces explicites

Nom Description
_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 méthodes exposées par un objet.

S’applique à

Cohérence de thread

Ce type est thread safe.

Voir aussi