Thread Classe
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
Crea e controlla un thread, ne imposta la priorità e ne ottiene lo stato.
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
- Ereditarietà
- Ereditarietà
-
Thread
- Attributi
- Implementazioni
Esempio
Nell'esempio seguente viene illustrata una semplice funzionalità di threading.
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
Questo codice produce un output simile al seguente:
[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.
Commenti
La Thread classe crea e controlla un thread, ne imposta la priorità e ne ottiene lo stato.
All'avvio di un processo, Common Language Runtime crea automaticamente un singolo thread in primo piano per eseguire il codice dell'applicazione. Insieme a questo thread principale in primo piano, un processo può creare uno o più thread per eseguire una parte del codice del programma associato al processo. Questi thread possono essere eseguiti in primo piano o in background. Inoltre, è possibile usare la ThreadPool classe per eseguire codice nei thread di lavoro gestiti da Common Language Runtime.
Avviare un thread
Si avvia un thread specificando un delegato che rappresenta il metodo che il thread deve essere eseguito nel relativo costruttore di classe. Chiamare quindi il metodo per iniziare l'esecuzione Start .
I Thread costruttori possono accettare uno dei due tipi di delegato, a seconda che sia possibile passare un argomento al metodo da eseguire:
Se il metodo non ha argomenti, passa una ThreadStart delega al costruttore. Ha la firma:
public delegate void ThreadStart()Public Delegate Sub ThreadStart()Nell'esempio seguente viene creato e avviato un thread che esegue il
ExecuteInForegroundmetodo . Il metodo visualizza informazioni su alcune proprietà del thread, quindi esegue un ciclo in cui viene sospeso per mezzo secondo e visualizza il numero trascorso di secondi. Quando il thread è stato eseguito per almeno cinque secondi, il ciclo termina e il thread termina l'esecuzione.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 secondsopen 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 secondsImports 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 secondsSe il metodo ha un argomento, passi un ParameterizedThreadStart delegato al costruttore. Ha la firma:
public delegate void ParameterizedThreadStart(object obj)Public Delegate Sub ParameterizedThreadStart(obj As Object)Il metodo eseguito dal delegato può quindi fare il casting (in C#) o convertire (in Visual Basic) il parametro nel tipo appropriato.
L'esempio seguente è identico a quello precedente, tranne che chiama il Thread(ParameterizedThreadStart) costruttore. Questa versione del metodo
ExecuteInForegroundha un singolo parametro che rappresenta il numero approssimativo di millisecondi per cui deve essere eseguito il ciclo.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 secondsopen 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 secondsImports 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
Non è necessario conservare un riferimento a un Thread oggetto dopo aver avviato il thread. Il thread continua a essere eseguito fino al completamento della routine del thread.
Recupera oggetti Thread
È possibile utilizzare la proprietà statica (Shared in Visual Basic) CurrentThread per recuperare un riferimento al thread attualmente in esecuzione dal codice in cui è in esecuzione il thread. Nell'esempio seguente viene utilizzata la CurrentThread proprietà per visualizzare informazioni sul thread applicazione principale, un altro thread in primo piano, un thread in background e un thread del pool di thread.
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
Thread in primo piano e in secondo piano
Le istanze della Thread classe rappresentano thread in primo piano o thread in background. I thread in background sono identici ai thread in primo piano con un'unica eccezione: un thread in background non mantiene un processo in esecuzione se tutti i thread in primo piano hanno terminato. Una volta arrestati tutti i thread in primo piano, il runtime arresta tutti i thread in background e si spegne.
Per impostazione predefinita, i thread seguenti sono eseguiti in primo piano:
Thread dell'applicazione principale.
Tutti i thread creati chiamando un Thread costruttore di classe.
Per impostazione predefinita, i thread seguenti sono eseguiti in background:
Thread del pool, provenienti da un pool di thread di lavoro gestiti dal runtime. È possibile configurare il pool di thread e pianificare il lavoro sui thread del pool usando la classe ThreadPool.
Note
Le operazioni asincrone basate su attività vengono eseguite automaticamente nel pool di thread. Le operazioni asincrone basate su attività usano le Task classi e Task<TResult> per implementare il modello asincrono basato su attività.
Tutti i thread che entrano nell'ambiente di esecuzione gestita da codice non gestito.
È possibile modificare un thread da eseguire in background impostando la IsBackground proprietà in qualsiasi momento. I thread in background sono utili per qualsiasi operazione che deve continuare finché un'applicazione è in esecuzione, ma non deve impedire all'applicazione di terminare, ad esempio il monitoraggio delle modifiche del file system o delle connessioni socket in ingresso.
L'esempio seguente illustra la differenza tra i thread in primo piano e quelli in background. È come il primo esempio nella sezione Avvia un thread , ad eccezione del fatto che imposta il thread da eseguire in background prima di avviarlo. Come illustrato nell'output, il ciclo viene interrotto prima dell'esecuzione per cinque secondi.
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...
Cultura e thread
Ogni thread ha una cultura, rappresentata dalla proprietà CurrentCulture, e una cultura dell'interfaccia utente, rappresentata dalla proprietà CurrentUICulture. La cultura corrente supporta operazioni sensibili alla cultura, come l'analisi della sintassi e la formattazione, il confronto di stringhe e l'ordinamento, e controlla anche il sistema di scrittura e il calendario usati nei processi del thread. La cultura corrente dell'interfaccia utente permette un recupero cultura-sensibile delle risorse nei file di risorse.
Important
Le CurrentCulture proprietà e CurrentUICulture non funzionano in modo affidabile quando vengono usate con qualsiasi thread diverso dal thread corrente. Viene generata un'eccezione InvalidOperationException se un thread tenta di leggere o scrivere queste proprietà in un thread diverso. È consigliabile usare le proprietà CultureInfo.CurrentCulture e CultureInfo.CurrentUICulture per recuperare e impostare la cultura corrente.
Quando viene creato un nuovo thread, la sua cultura e cultura dell'interfaccia utente sono definite dalla cultura corrente del sistema e dalla cultura dell'interfaccia utente corrente e non dalla cultura e dalla cultura dell'interfaccia utente del thread da cui viene creato. Ciò significa, ad esempio, che se la cultura di sistema corrente è inglese (Stati Uniti) e la cultura corrente del thread applicazione primario è francese (Francia), la cultura di un nuovo thread creato chiamando il costruttore Thread(ParameterizedThreadStart) dal thread primario è inglese (Stati Uniti) e non francese (Francia). Per altre informazioni, vedere la sezione "Impostazioni cultura e thread" dell'argomento della CultureInfo classe.
Important
Questo non vale per i thread che eseguono operazioni asincrone per le app destinate a .NET Framework 4.6 e versioni successive. In questo caso, le impostazioni cultura e le impostazioni cultura dell'interfaccia utente fanno parte del contesto di un'operazione asincrona; Il thread in cui viene eseguita un'operazione asincrona per impostazione predefinita eredita le impostazioni cultura e le impostazioni cultura dell'interfaccia utente del thread da cui è stata avviata l'operazione asincrona. Per ulteriori informazioni, consultare la sezione "Cultura e operazioni asincrone basate su attività" nelle osservazioni della classe CultureInfo.
È possibile eseguire una delle operazioni seguenti per assicurarsi che tutti i thread che vengono eseguiti in un'applicazione condividano la stessa cultura e cultura dell'interfaccia utente.
Puoi passare un oggetto CultureInfo che rappresenta quella cultura al delegato ParameterizedThreadStart o al metodo ThreadPool.QueueUserWorkItem(WaitCallback, Object).
Per le app in esecuzione su .NET Framework 4.5 e versioni successive, è possibile definire la cultura e la cultura dell'interfaccia utente da assegnare a tutti i thread creati in un dominio dell'applicazione impostando il valore delle proprietà CultureInfo.DefaultThreadCurrentCulture e CultureInfo.DefaultThreadCurrentUICulture. Si noti che si tratta di un'impostazione di dominio per applicazione.
Per altre informazioni ed esempi, vedere la sezione "Impostazioni cultura e thread" delle osservazioni sulla classe CultureInfo.
Ottenere informazioni sui thread e controllarli
È possibile recuperare una serie di valori di proprietà che forniscono informazioni su un thread. In alcuni casi, è anche possibile impostare questi valori di proprietà per controllare l'operazione del thread. Queste proprietà del thread includono:
Un nome. Name è una proprietà write-once che è possibile usare per identificare un thread. Il valore predefinito è
null.Codice hash, che è possibile recuperare chiamando il GetHashCode metodo . Il codice hash può essere usato per identificare in modo univoco un thread; per la durata del thread, il relativo codice hash non sarà in conflitto con il valore di qualsiasi altro thread, indipendentemente dal dominio dell'applicazione da cui si ottiene il valore.
Identificativo del thread. Il valore della proprietà di sola ManagedThreadId lettura viene assegnato dal runtime e identifica in modo univoco un thread all'interno del relativo processo.
Note
ThreadId del sistema operativo non ha alcuna relazione fissa con un thread gestito, perché un host non gestito può controllare la relazione tra thread gestiti e non gestiti. In particolare, un host sofisticato può usare l'API di hosting CLR per pianificare molti thread gestiti sullo stesso thread del sistema operativo o spostare un thread gestito tra diversi thread del sistema operativo.
Stato corrente del thread. Per la durata dell'esistenza, un thread si trova sempre in uno o più stati definiti dalla ThreadState proprietà .
Livello di priorità di pianificazione, definito dalla ThreadPriority proprietà . Sebbene sia possibile impostare questo valore per richiedere la priorità di un thread, non è garantito che venga rispettato dal sistema operativo.
La proprietà IsThreadPoolThread, che è di sola lettura, indica se un thread è un thread del pool di thread.
La proprietà IsBackground. Per ulteriori informazioni, vedere la sezione Thread in primo piano e in background.
Costruttori
| Nome | Descrizione |
|---|---|
| Thread(ParameterizedThreadStart, Int32) |
Inizializza una nuova istanza della Thread classe , specificando un delegato che consente di passare un oggetto al thread all'avvio del thread e specificando le dimensioni massime dello stack per il thread. |
| Thread(ParameterizedThreadStart) |
Inizializza una nuova istanza della Thread classe , specificando un delegato che consente di passare un oggetto al thread all'avvio del thread. |
| Thread(ThreadStart, Int32) |
Inizializza una nuova istanza della Thread classe , specificando le dimensioni massime dello stack per il thread. |
| Thread(ThreadStart) |
Inizializza una nuova istanza della classe Thread. |
Proprietà
| Nome | Descrizione |
|---|---|
| ApartmentState |
Obsoleti.
Obsoleti.
Ottiene o imposta lo stato dell'apartment di questo thread. |
| CurrentContext |
Ottiene il contesto corrente in cui è in esecuzione il thread. |
| CurrentCulture |
Ottiene o imposta le impostazioni cultura per il thread corrente. |
| CurrentPrincipal |
Ottiene o imposta l'entità corrente del thread (per la sicurezza basata sui ruoli). |
| CurrentThread |
Ottiene il thread attualmente in esecuzione. |
| CurrentUICulture |
Ottiene o imposta le impostazioni cultura correnti usate da Resource Manager per cercare risorse specifiche delle impostazioni cultura in fase di esecuzione. |
| ExecutionContext |
Ottiene un ExecutionContext oggetto che contiene informazioni sui vari contesti del thread corrente. |
| IsAlive |
Ottiene un valore che indica lo stato di esecuzione del thread corrente. |
| IsBackground |
Ottiene o imposta un valore che indica se un thread è un thread in background. |
| IsThreadPoolThread |
Ottiene un valore che indica se un thread appartiene o meno al pool di thread gestiti. |
| ManagedThreadId |
Ottiene un identificatore univoco per il thread gestito corrente. |
| Name |
Ottiene o imposta il nome del thread. |
| Priority |
Ottiene o imposta un valore che indica la priorità di pianificazione di un thread. |
| ThreadState |
Ottiene un valore contenente gli stati del thread corrente. |
Metodi
| Nome | Descrizione |
|---|---|
| Abort() |
Obsoleti.
Genera un ThreadAbortException oggetto nel thread su cui viene richiamato, per avviare il processo di terminazione del thread. La chiamata a questo metodo in genere termina il thread. |
| Abort(Object) |
Obsoleti.
Genera un ThreadAbortException oggetto nel thread in cui viene richiamato, per iniziare il processo di terminazione del thread fornendo al tempo stesso informazioni sulle eccezioni relative alla terminazione del thread. La chiamata a questo metodo in genere termina il thread. |
| AllocateDataSlot() |
Alloca uno slot di dati senza nome in tutti i thread. Per prestazioni migliori, usare invece i campi contrassegnati con l'attributo ThreadStaticAttribute . |
| AllocateNamedDataSlot(String) |
Alloca uno slot di dati denominato in tutti i thread. Per prestazioni migliori, usare invece i campi contrassegnati con l'attributo ThreadStaticAttribute . |
| BeginCriticalRegion() |
Notifica a un host che l'esecuzione sta per immettere un'area di codice in cui gli effetti di un'interruzione del thread o di un'eccezione non gestita potrebbero compromettere altre attività nel dominio applicazione. |
| BeginThreadAffinity() |
Notifica a un host che il codice gestito sta per eseguire istruzioni che dipendono dall'identità del thread del sistema operativo fisico corrente. |
| DisableComObjectEagerCleanup() |
Disattiva la pulizia automatica dei wrapper chiamabili di runtime (RCW) per il thread corrente. |
| EndCriticalRegion() |
Notifica a un host che l'esecuzione sta per entrare in un'area di codice in cui gli effetti di un'interruzione del thread o di un'eccezione non gestita sono limitati all'attività corrente. |
| EndThreadAffinity() |
Notifica a un host che il codice gestito ha completato l'esecuzione di istruzioni che dipendono dall'identità del thread del sistema operativo fisico corrente. |
| Equals(Object) |
Determina se l'oggetto specificato è uguale all'oggetto corrente. (Ereditato da Object) |
| Finalize() |
Assicura che le risorse vengano liberate e che vengano eseguite altre operazioni di pulizia quando il Garbage Collector recupera l'oggetto Thread . |
| FreeNamedDataSlot(String) |
Elimina l'associazione tra un nome e uno slot, per tutti i thread nel processo. Per prestazioni migliori, usare invece i campi contrassegnati con l'attributo ThreadStaticAttribute . |
| GetApartmentState() |
Restituisce un ApartmentState valore che indica lo stato dell'apartment. |
| GetCompressedStack() |
Obsoleti.
Obsoleti.
Restituisce un CompressedStack oggetto che può essere utilizzato per acquisire lo stack per il thread corrente. |
| GetCurrentProcessorId() |
Ottiene un ID utilizzato per indicare il processore in cui è in esecuzione il thread corrente. |
| GetData(LocalDataStoreSlot) |
Recupera il valore dallo slot specificato nel thread corrente, all'interno del dominio corrente del thread corrente. Per prestazioni migliori, usare invece i campi contrassegnati con l'attributo ThreadStaticAttribute . |
| GetDomain() |
Restituisce il dominio corrente in cui è in esecuzione il thread corrente. |
| GetDomainID() |
Restituisce un identificatore univoco del dominio dell'applicazione. |
| GetHashCode() |
Restituisce un codice hash per il thread corrente. |
| GetHashCode() |
Funge da funzione hash predefinita. (Ereditato da Object) |
| GetNamedDataSlot(String) |
Cerca uno slot di dati denominato. Per prestazioni migliori, usare invece i campi contrassegnati con l'attributo ThreadStaticAttribute . |
| GetType() |
Ottiene il Type dell'istanza corrente. (Ereditato da Object) |
| Interrupt() |
Interrompe un thread nello stato del WaitSleepJoin thread. |
| Join() |
Blocca il thread chiamante fino a quando il thread rappresentato da questa istanza termina, continuando a eseguire com standard e |
| Join(Int32) |
Blocca il thread chiamante fino a quando il thread rappresentato da questa istanza termina o il tempo specificato è trascorso, continuando a eseguire il pumping COM e SendMessage standard. |
| Join(TimeSpan) |
Blocca il thread chiamante fino a quando il thread rappresentato da questa istanza termina o il tempo specificato è trascorso, continuando a eseguire il pumping COM e SendMessage standard. |
| MemberwiseClone() |
Crea una copia superficiale del Objectcorrente. (Ereditato da Object) |
| MemoryBarrier() |
Sincronizza l'accesso alla memoria come indicato di seguito: il processore che esegue il thread corrente non può riordinare le istruzioni in modo che la memoria accesa prima della chiamata da MemoryBarrier() eseguire dopo gli accessi alla memoria che seguono la chiamata a MemoryBarrier(). |
| ResetAbort() |
Obsoleti.
Annulla un oggetto Abort(Object) richiesto per il thread corrente. |
| Resume() |
Obsoleti.
Obsoleti.
Obsoleti.
Riprende un thread sospeso. |
| SetApartmentState(ApartmentState) |
Imposta lo stato apartment di un thread prima dell'avvio. |
| SetCompressedStack(CompressedStack) |
Obsoleti.
Obsoleti.
Applica un oggetto acquisito CompressedStack al thread corrente. |
| SetData(LocalDataStoreSlot, Object) |
Imposta i dati nello slot specificato nel thread attualmente in esecuzione, per il dominio corrente del thread. Per ottenere prestazioni migliori, usare invece i campi contrassegnati con l'attributo ThreadStaticAttribute . |
| Sleep(Int32) |
Sospende il thread corrente per il numero specificato di millisecondi. |
| Sleep(TimeSpan) |
Sospende il thread corrente per la quantità di tempo specificata. |
| SpinWait(Int32) |
Fa in modo che un thread attenda il numero di volte definito dal |
| Start() |
Fa sì che il sistema operativo modifichi lo stato dell'istanza corrente in Running. |
| Start(Object) |
Fa sì che il sistema operativo modifichi lo stato dell'istanza corrente in Runninge, facoltativamente, fornisca un oggetto contenente dati da utilizzare dal metodo eseguito dal thread. |
| Suspend() |
Obsoleti.
Obsoleti.
Obsoleti.
Sospende il thread o se il thread è già sospeso, non ha alcun effetto. |
| ToString() |
Restituisce una stringa che rappresenta l'oggetto corrente. (Ereditato da Object) |
| TrySetApartmentState(ApartmentState) |
Imposta lo stato apartment di un thread prima dell'avvio. |
| UnsafeStart() |
Fa sì che il sistema operativo modifichi lo stato dell'istanza corrente in Running. |
| UnsafeStart(Object) |
Fa sì che il sistema operativo modifichi lo stato dell'istanza corrente in Runninge, facoltativamente, fornisca un oggetto contenente dati da utilizzare dal metodo eseguito dal thread. |
| VolatileRead(Byte) |
Obsoleti.
Legge il valore di un campo. Nei sistemi che lo richiedono, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria come indicato di seguito: se viene visualizzata una lettura o una scrittura dopo questo metodo nel codice, il processore non può spostarlo prima di questo metodo. |
| VolatileRead(Double) |
Obsoleti.
Legge il valore di un campo. Nei sistemi che lo richiedono, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria come indicato di seguito: se viene visualizzata una lettura o una scrittura dopo questo metodo nel codice, il processore non può spostarlo prima di questo metodo. |
| VolatileRead(Int16) |
Obsoleti.
Legge il valore di un campo. Nei sistemi che lo richiedono, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria come indicato di seguito: se viene visualizzata una lettura o una scrittura dopo questo metodo nel codice, il processore non può spostarlo prima di questo metodo. |
| VolatileRead(Int32) |
Obsoleti.
Legge il valore di un campo. Nei sistemi che lo richiedono, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria come indicato di seguito: se viene visualizzata una lettura o una scrittura dopo questo metodo nel codice, il processore non può spostarlo prima di questo metodo. |
| VolatileRead(Int64) |
Obsoleti.
Legge il valore di un campo. Nei sistemi che lo richiedono, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria come indicato di seguito: se viene visualizzata una lettura o una scrittura dopo questo metodo nel codice, il processore non può spostarlo prima di questo metodo. |
| VolatileRead(IntPtr) |
Obsoleti.
Legge il valore di un campo. Nei sistemi che lo richiedono, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria come indicato di seguito: se viene visualizzata una lettura o una scrittura dopo questo metodo nel codice, il processore non può spostarlo prima di questo metodo. |
| VolatileRead(Object) |
Obsoleti.
Legge il valore di un campo. Nei sistemi che lo richiedono, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria come indicato di seguito: se viene visualizzata una lettura o una scrittura dopo questo metodo nel codice, il processore non può spostarlo prima di questo metodo. |
| VolatileRead(SByte) |
Obsoleti.
Legge il valore di un campo. Nei sistemi che lo richiedono, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria come indicato di seguito: se viene visualizzata una lettura o una scrittura dopo questo metodo nel codice, il processore non può spostarlo prima di questo metodo. |
| VolatileRead(Single) |
Obsoleti.
Legge il valore di un campo. Nei sistemi che lo richiedono, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria come indicato di seguito: se viene visualizzata una lettura o una scrittura dopo questo metodo nel codice, il processore non può spostarlo prima di questo metodo. |
| VolatileRead(UInt16) |
Obsoleti.
Legge il valore di un campo. Nei sistemi che lo richiedono, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria come indicato di seguito: se viene visualizzata una lettura o una scrittura dopo questo metodo nel codice, il processore non può spostarlo prima di questo metodo. |
| VolatileRead(UInt32) |
Obsoleti.
Legge il valore di un campo. Nei sistemi che lo richiedono, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria come indicato di seguito: se viene visualizzata una lettura o una scrittura dopo questo metodo nel codice, il processore non può spostarlo prima di questo metodo. |
| VolatileRead(UInt64) |
Obsoleti.
Legge il valore di un campo. Nei sistemi che lo richiedono, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria come indicato di seguito: se viene visualizzata una lettura o una scrittura dopo questo metodo nel codice, il processore non può spostarlo prima di questo metodo. |
| VolatileRead(UIntPtr) |
Obsoleti.
Legge il valore di un campo. Nei sistemi che lo richiedono, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria come indicato di seguito: se viene visualizzata una lettura o una scrittura dopo questo metodo nel codice, il processore non può spostarlo prima di questo metodo. |
| VolatileWrite(Byte, Byte) |
Obsoleti.
Scrive un valore in un campo. Nei sistemi che lo richiedono, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria come indicato di seguito: se viene visualizzata una lettura o una scrittura prima di questo metodo nel codice, il processore non può spostarlo dopo questo metodo. |
| VolatileWrite(Double, Double) |
Obsoleti.
Scrive un valore in un campo. Nei sistemi che lo richiedono, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria come indicato di seguito: se viene visualizzata una lettura o una scrittura prima di questo metodo nel codice, il processore non può spostarlo dopo questo metodo. |
| VolatileWrite(Int16, Int16) |
Obsoleti.
Scrive un valore in un campo. Nei sistemi che lo richiedono, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria come indicato di seguito: se viene visualizzata una lettura o una scrittura prima di questo metodo nel codice, il processore non può spostarlo dopo questo metodo. |
| VolatileWrite(Int32, Int32) |
Obsoleti.
Scrive un valore in un campo. Nei sistemi che lo richiedono, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria come indicato di seguito: se viene visualizzata una lettura o una scrittura prima di questo metodo nel codice, il processore non può spostarlo dopo questo metodo. |
| VolatileWrite(Int64, Int64) |
Obsoleti.
Scrive un valore in un campo. Nei sistemi che lo richiedono, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria come indicato di seguito: se viene visualizzata una lettura o una scrittura prima di questo metodo nel codice, il processore non può spostarlo dopo questo metodo. |
| VolatileWrite(IntPtr, IntPtr) |
Obsoleti.
Scrive un valore in un campo. Nei sistemi che lo richiedono, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria come indicato di seguito: se viene visualizzata una lettura o una scrittura prima di questo metodo nel codice, il processore non può spostarlo dopo questo metodo. |
| VolatileWrite(Object, Object) |
Obsoleti.
Scrive un valore in un campo. Nei sistemi che lo richiedono, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria come indicato di seguito: se viene visualizzata una lettura o una scrittura prima di questo metodo nel codice, il processore non può spostarlo dopo questo metodo. |
| VolatileWrite(SByte, SByte) |
Obsoleti.
Scrive un valore in un campo. Nei sistemi che lo richiedono, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria come indicato di seguito: se viene visualizzata una lettura o una scrittura prima di questo metodo nel codice, il processore non può spostarlo dopo questo metodo. |
| VolatileWrite(Single, Single) |
Obsoleti.
Scrive un valore in un campo. Nei sistemi che lo richiedono, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria come indicato di seguito: se viene visualizzata una lettura o una scrittura prima di questo metodo nel codice, il processore non può spostarlo dopo questo metodo. |
| VolatileWrite(UInt16, UInt16) |
Obsoleti.
Scrive un valore in un campo. Nei sistemi che lo richiedono, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria come indicato di seguito: se viene visualizzata una lettura o una scrittura prima di questo metodo nel codice, il processore non può spostarlo dopo questo metodo. |
| VolatileWrite(UInt32, UInt32) |
Obsoleti.
Scrive un valore in un campo. Nei sistemi che lo richiedono, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria come indicato di seguito: se viene visualizzata una lettura o una scrittura prima di questo metodo nel codice, il processore non può spostarlo dopo questo metodo. |
| VolatileWrite(UInt64, UInt64) |
Obsoleti.
Scrive un valore in un campo. Nei sistemi che lo richiedono, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria come indicato di seguito: se viene visualizzata una lettura o una scrittura prima di questo metodo nel codice, il processore non può spostarlo dopo questo metodo. |
| VolatileWrite(UIntPtr, UIntPtr) |
Obsoleti.
Scrive un valore in un campo. Nei sistemi che lo richiedono, inserisce una barriera di memoria che impedisce al processore di riordinare le operazioni di memoria come indicato di seguito: se viene visualizzata una lettura o una scrittura prima di questo metodo nel codice, il processore non può spostarlo dopo questo metodo. |
| Yield() |
Determina che il thread chiamante ceda l'esecuzione a un altro thread pronto per l'esecuzione sul processore corrente. Il sistema operativo seleziona il thread da restituire. |
Implementazioni dell'interfaccia esplicita
| Nome | Descrizione |
|---|---|
| _Thread.GetIDsOfNames(Guid, IntPtr, UInt32, UInt32, IntPtr) |
Esegue il mapping di un set di nomi a un set corrispondente di identificatori dispatch. |
| _Thread.GetTypeInfo(UInt32, UInt32, IntPtr) |
Recupera le informazioni sul tipo relative a un oggetto che può quindi essere usato per ottenere informazioni sul tipo relative a un'interfaccia. |
| _Thread.GetTypeInfoCount(UInt32) |
Recupera il numero di interfacce di informazioni sul tipo fornite da un oggetto (0 o 1). |
| _Thread.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr) |
Fornisce l'accesso alle proprietà e ai metodi esposti da un oggetto . |
Si applica a
Thread safety
Questo tipo è thread-safe.