Timer Timer Timer Timer Class

Definizione

Fornisce un meccanismo per eseguire un metodo su un thread del pool di thread a intervalli specificati.Provides a mechanism for executing a method on a thread pool thread at specified intervals. Questa classe non può essere ereditata.This class cannot be inherited.

public ref class Timer sealed : MarshalByRefObject, IDisposable
[System.Runtime.InteropServices.ComVisible(true)]
public sealed class Timer : MarshalByRefObject, IDisposable
type Timer = class
    inherit MarshalByRefObject
    interface IDisposable
Public NotInheritable Class Timer
Inherits MarshalByRefObject
Implements IDisposable
Ereditarietà
Attributi
Implementazioni

Esempi

Nell'esempio seguente viene definita StatusChecker una classe che include CheckStatus un metodo la cui firma corrisponde a quella TimerCallback del delegato.The following example defines a StatusChecker class that includes a CheckStatus method whose signature is the same as the TimerCallback delegate. L' state argomento AutoResetEvent del metodo è un oggetto utilizzato per sincronizzare il thread dell'applicazione e il thread del pool di thread che esegue il delegato di callback. CheckStatusThe state argument of the CheckStatus method is an AutoResetEvent object that is used to synchronize the application thread and the thread pool thread that executes the callback delegate. La StatusChecker classe include anche due variabili di stato:The StatusChecker class also includes two state variables:

invokeCount
Indica il numero di volte in cui il metodo di callback è stato richiamato.Indicates the number of times the callback method has been invoked.

maxCount
Determina il numero massimo di volte in cui il metodo di callback deve essere richiamato.Determines the maximum number of times the callback method should be invoked.

Il thread dell'applicazione crea il timer, che attende un secondo, quindi esegue il CheckStatus metodo di callback ogni 250 millisecondi.The application thread creates the timer, which waits one second and then executes the CheckStatus callback method every 250 milliseconds. Il thread dell'applicazione si blocca fino AutoResetEvent a quando l'oggetto non viene segnalato.The application thread then blocks until the AutoResetEvent object is signaled. Quando il CheckStatus metodo di callback maxCount viene eseguito volte, chiama il AutoResetEvent.Set metodo per impostare lo stato dell' AutoResetEvent oggetto su segnalato.When the CheckStatus callback method executes maxCount times, it calls the AutoResetEvent.Set method to set the state of the AutoResetEvent object to signaled. La prima volta che si verifica questo problema, il thread Change(Int32, Int32) dell'applicazione chiama il metodo in modo che il metodo di callback venga eseguito ogni mezzo secondo.The first time this happens, the application thread calls the Change(Int32, Int32) method so that the callback method now executes every half second. Si blocca ancora una volta fino AutoResetEvent a quando l'oggetto non viene segnalato.It once again blocks until the AutoResetEvent object is signaled. Quando ciò si verifica, il timer viene eliminato chiamando il Dispose relativo metodo e l'applicazione termina.When this happens, the timer is destroyed by calling its Dispose method, and the application terminates.

using namespace System;
using namespace System::Threading;

ref class StatusChecker
{
private:
    int invokeCount, maxCount;

public:
    StatusChecker(int count)
    {
        invokeCount  = 0;
        maxCount = count;
    }

    // This method is called by the timer delegate.
    void CheckStatus(Object^ stateInfo)
    {
        AutoResetEvent^ autoEvent = dynamic_cast<AutoResetEvent^>(stateInfo);
        Console::WriteLine("{0:h:mm:ss.fff} Checking status {1,2}.",
                           DateTime::Now, ++invokeCount);

        if (invokeCount == maxCount) {
            // Reset the counter and signal the waiting thread.
            invokeCount  = 0;
            autoEvent->Set();
        }
    }
};

ref class TimerExample
{
public:
    static void Main()
    {
        // Create an AutoResetEvent to signal the timeout threshold in the
        // timer callback has been reached.
        AutoResetEvent^ autoEvent = gcnew AutoResetEvent(false);

        StatusChecker^ statusChecker = gcnew StatusChecker(10);

        // Create a delegate that invokes methods for the timer.
        TimerCallback^ tcb =
           gcnew TimerCallback(statusChecker, &StatusChecker::CheckStatus);

        // Create a timer that invokes CheckStatus after one second, 
        // and every 1/4 second thereafter.
        Console::WriteLine("{0:h:mm:ss.fff} Creating timer.\n",
                           DateTime::Now);
        Timer^ stateTimer = gcnew Timer(tcb, autoEvent, 1000, 250);

        // When autoEvent signals, change the period to every half second.
        autoEvent->WaitOne(5000, false);
        stateTimer->Change(0, 500);
        Console::WriteLine("\nChanging period to .5 seconds.\n");

        // When autoEvent signals the second time, dispose of the timer.
        autoEvent->WaitOne(5000, false);
        stateTimer->~Timer();
        Console::WriteLine("\nDestroying timer.");
    }
};

int main()
{
    TimerExample::Main();
}
// The example displays output like the following:
//       11:59:54.202 Creating timer.
//       
//       11:59:55.217 Checking status  1.
//       11:59:55.466 Checking status  2.
//       11:59:55.716 Checking status  3.
//       11:59:55.968 Checking status  4.
//       11:59:56.218 Checking status  5.
//       11:59:56.470 Checking status  6.
//       11:59:56.722 Checking status  7.
//       11:59:56.972 Checking status  8.
//       11:59:57.223 Checking status  9.
//       11:59:57.473 Checking status 10.
//       
//       Changing period to .5 seconds.
//       
//       11:59:57.474 Checking status  1.
//       11:59:57.976 Checking status  2.
//       11:59:58.476 Checking status  3.
//       11:59:58.977 Checking status  4.
//       11:59:59.477 Checking status  5.
//       11:59:59.977 Checking status  6.
//       12:00:00.478 Checking status  7.
//       12:00:00.980 Checking status  8.
//       12:00:01.481 Checking status  9.
//       12:00:01.981 Checking status 10.
//       
//       Destroying timer.
using System;
using System.Threading;

class TimerExample
{
    static void Main()
    {
        // Create an AutoResetEvent to signal the timeout threshold in the
        // timer callback has been reached.
        var autoEvent = new AutoResetEvent(false);
        
        var statusChecker = new StatusChecker(10);

        // Create a timer that invokes CheckStatus after one second, 
        // and every 1/4 second thereafter.
        Console.WriteLine("{0:h:mm:ss.fff} Creating timer.\n", 
                          DateTime.Now);
        var stateTimer = new Timer(statusChecker.CheckStatus, 
                                   autoEvent, 1000, 250);

        // When autoEvent signals, change the period to every half second.
        autoEvent.WaitOne();
        stateTimer.Change(0, 500);
        Console.WriteLine("\nChanging period to .5 seconds.\n");

        // When autoEvent signals the second time, dispose of the timer.
        autoEvent.WaitOne();
        stateTimer.Dispose();
        Console.WriteLine("\nDestroying timer.");
    }
}

class StatusChecker
{
    private int invokeCount;
    private int  maxCount;

    public StatusChecker(int count)
    {
        invokeCount  = 0;
        maxCount = count;
    }

    // This method is called by the timer delegate.
    public void CheckStatus(Object stateInfo)
    {
        AutoResetEvent autoEvent = (AutoResetEvent)stateInfo;
        Console.WriteLine("{0} Checking status {1,2}.", 
            DateTime.Now.ToString("h:mm:ss.fff"), 
            (++invokeCount).ToString());

        if(invokeCount == maxCount)
        {
            // Reset the counter and signal the waiting thread.
            invokeCount = 0;
            autoEvent.Set();
        }
    }
}
// The example displays output like the following:
//       11:59:54.202 Creating timer.
//       
//       11:59:55.217 Checking status  1.
//       11:59:55.466 Checking status  2.
//       11:59:55.716 Checking status  3.
//       11:59:55.968 Checking status  4.
//       11:59:56.218 Checking status  5.
//       11:59:56.470 Checking status  6.
//       11:59:56.722 Checking status  7.
//       11:59:56.972 Checking status  8.
//       11:59:57.223 Checking status  9.
//       11:59:57.473 Checking status 10.
//       
//       Changing period to .5 seconds.
//       
//       11:59:57.474 Checking status  1.
//       11:59:57.976 Checking status  2.
//       11:59:58.476 Checking status  3.
//       11:59:58.977 Checking status  4.
//       11:59:59.477 Checking status  5.
//       11:59:59.977 Checking status  6.
//       12:00:00.478 Checking status  7.
//       12:00:00.980 Checking status  8.
//       12:00:01.481 Checking status  9.
//       12:00:01.981 Checking status 10.
//       
//       Destroying timer.
Imports System.Threading

Public Module Example
    Public Sub Main()
        ' Use an AutoResetEvent to signal the timeout threshold in the
        ' timer callback has been reached.
        Dim autoEvent As New AutoResetEvent(False)

        Dim statusChecker As New StatusChecker(10)

        ' Create a timer that invokes CheckStatus after one second, 
        ' and every 1/4 second thereafter.
        Console.WriteLine("{0:h:mm:ss.fff} Creating timer." & vbCrLf, 
                          DateTime.Now)
        Dim stateTimer As New Timer(AddressOf statusChecker.CheckStatus, 
                                    autoEvent, 1000, 250)

        ' When autoEvent signals, change the period to every half second.
        autoEvent.WaitOne()
        stateTimer.Change(0, 500)
        Console.WriteLine(vbCrLf & "Changing period to .5 seconds." & vbCrLf)

        ' When autoEvent signals the second time, dispose of the timer.
        autoEvent.WaitOne()
        stateTimer.Dispose()
        Console.WriteLine(vbCrLf & "Destroying timer.")
    End Sub
End Module

Public Class StatusChecker
    Dim invokeCount, maxCount As Integer 

    Sub New(count As Integer)
        invokeCount  = 0
        maxCount = count
    End Sub

    ' The timer callback method.
    Sub CheckStatus(stateInfo As Object)
        Dim autoEvent As AutoResetEvent = DirectCast(stateInfo, AutoResetEvent)
        invokeCount += 1
        Console.WriteLine("{0:h:mm:ss.fff} Checking status {1,2}.", 
                          DateTime.Now, invokeCount)
        If invokeCount = maxCount Then
            ' Reset the counter and signal the waiting thread.
            invokeCount = 0
            autoEvent.Set()
        End If
    End Sub
End Class
' The example displays output like the following:
'       11:59:54.202 Creating timer.
'       
'       11:59:55.217 Checking status  1.
'       11:59:55.466 Checking status  2.
'       11:59:55.716 Checking status  3.
'       11:59:55.968 Checking status  4.
'       11:59:56.218 Checking status  5.
'       11:59:56.470 Checking status  6.
'       11:59:56.722 Checking status  7.
'       11:59:56.972 Checking status  8.
'       11:59:57.223 Checking status  9.
'       11:59:57.473 Checking status 10.
'       
'       Changing period to .5 seconds.
'       
'       11:59:57.474 Checking status  1.
'       11:59:57.976 Checking status  2.
'       11:59:58.476 Checking status  3.
'       11:59:58.977 Checking status  4.
'       11:59:59.477 Checking status  5.
'       11:59:59.977 Checking status  6.
'       12:00:00.478 Checking status  7.
'       12:00:00.980 Checking status  8.
'       12:00:01.481 Checking status  9.
'       12:00:01.981 Checking status 10.
'       
'       Destroying timer.

Commenti

Utilizzare un TimerCallback delegato per specificare il metodo che si Timer desidera venga eseguito da.Use a TimerCallback delegate to specify the method you want the Timer to execute. La firma del TimerCallback delegato è la seguente:The signature of the TimerCallback delegate is:

void TimerCallback(Object state)  
void TimerCallback(Object state)  
Sub TimerCallback(state As Object)  

Il delegato del timer viene specificato al momento della costruzione del timer e non può essere modificato.The timer delegate is specified when the timer is constructed, and cannot be changed. Il metodo non viene eseguito sul thread che ha creato il timer. viene eseguito su un ThreadPool thread fornito dal sistema.The method does not execute on the thread that created the timer; it executes on a ThreadPool thread supplied by the system.

Suggerimento

.NET include quattro classi denominate Timer, ognuna delle quali offre funzionalità diverse:.NET includes four classes named Timer, each of which offers different functionality:

  • System.Timers.Timer, che genera un evento ed esegue il codice in uno o più sink di evento a intervalli regolari.System.Timers.Timer, which fires an event and executes the code in one or more event sinks at regular intervals. La classe è destinata all'uso come componente basato su server o servizio in un ambiente a thread multipli. non dispone di interfaccia utente e non è visibile in fase di esecuzione.The class is intended for use as a server-based or service component in a multithreaded environment; it has no user interface and is not visible at runtime.
  • System.Threading.Timer, che esegue un singolo metodo di callback in un thread del pool a intervalli regolari.System.Threading.Timer, which executes a single callback method on a thread pool thread at regular intervals. Il metodo di callback viene definito quando viene creata un'istanza del timer e non può essere modificato.The callback method is defined when the timer is instantiated and cannot be changed. Analogamente System.Timers.Timer alla classe, questa classe è destinata all'uso come componente basato su server o servizio in un ambiente a thread multipli. non dispone di interfaccia utente e non è visibile in fase di esecuzione.Like the System.Timers.Timer class, this class is intended for use as a server-based or service component in a multithreaded environment; it has no user interface and is not visible at runtime.
  • System.Windows.Forms.Timer(Solo .NET Framework), un componente Windows Forms che genera un evento ed esegue il codice in uno o più sink di evento a intervalli regolari.System.Windows.Forms.Timer (.NET Framework only), a Windows Forms component that fires an event and executes the code in one or more event sinks at regular intervals. Il componente non dispone di un'interfaccia utente ed è progettato per l'utilizzo in un ambiente a thread singolo. viene eseguito sul thread dell'interfaccia utente.The component has no user interface and is designed for use in a single-threaded environment; it executes on the UI thread.
  • System.Web.UI.Timer(Solo .NET Framework), un componente ASP.NET che esegue postback asincroni o sincroni di pagine Web a intervalli regolari.System.Web.UI.Timer (.NET Framework only), an ASP.NET component that performs asynchronous or synchronous web page postbacks at a regular interval.

Quando si crea un timer, è possibile specificare un periodo di tempo di attesa prima della prima esecuzione del metodo (tempo di scadenza) e un intervallo di tempo di attesa tra le esecuzioni successive (periodo).When you create a timer, you can specify an amount of time to wait before the first execution of the method (due time), and an amount of time to wait between subsequent executions (period). La Timer classe ha la stessa risoluzione del clock di sistema.The Timer class has the same resolution as the system clock. Ciò significa che se il periodo è inferiore alla risoluzione del clock di sistema, il TimerCallback delegato verrà eseguito a intervalli definiti dalla risoluzione del clock di sistema, che è approssimativamente di 15 millisecondi nei sistemi Windows 7 e Windows 8.This means that if the period is less than the resolution of the system clock, the TimerCallback delegate will execute at intervals defined by the resolution of the system clock, which is approximately 15 milliseconds on Windows 7 and Windows 8 systems. È possibile modificare il tempo di scadenza e il periodo oppure disabilitare il timer usando il Change metodo.You can change the due time and period, or disable the timer, by using the Change method.

Nota

Fino a quando si usa un Timer, è necessario mantenervi un riferimento.As long as you are using a Timer, you must keep a reference to it. Come per qualsiasi oggetto gestito, un Timer oggetto è soggetto a Garbage Collection quando non vi sono riferimenti.As with any managed object, a Timer is subject to garbage collection when there are no references to it. Il fatto che un Timer oggetto sia ancora attivo non ne impedisce la raccolta.The fact that a Timer is still active does not prevent it from being collected.

Quando un timer non è più necessario, utilizzare il Dispose metodo per liberare le risorse utilizzate dal timer.When a timer is no longer needed, use the Dispose method to free the resources held by the timer. Si noti che i callback possono verificarsi dopo Dispose() la chiamata dell'overload del metodo, perché il timer accoda i callback per l'esecuzione da parte dei thread del pool di thread.Note that callbacks can occur after the Dispose() method overload has been called, because the timer queues callbacks for execution by thread pool threads. È possibile utilizzare l' Dispose(WaitHandle) overload del metodo per attendere il completamento di tutti i callback.You can use the Dispose(WaitHandle) method overload to wait until all callbacks have completed.

Il metodo di callback eseguito dal timer deve essere rientrante, perché viene chiamato nei ThreadPool thread.The callback method executed by the timer should be reentrant, because it is called on ThreadPool threads. Il callback può essere eseguito contemporaneamente su due thread del pool di thread se l'intervallo del timer è inferiore al tempo necessario per eseguire il callback o se tutti i thread del pool di thread sono in uso e il callback viene accodato più volte.The callback can be executed simultaneously on two thread pool threads if the timer interval is less than the time required to execute the callback, or if all thread pool threads are in use and the callback is queued multiple times.

Nota

System.Threading.Timerè un timer semplice e leggero che utilizza metodi di callback e viene servito dai thread del pool di thread.System.Threading.Timer is a simple, lightweight timer that uses callback methods and is served by thread pool threads. Non è consigliabile usarlo con Windows Forms, perché i callback non vengono eseguiti nel thread dell'interfaccia utente.It is not recommended for use with Windows Forms, because its callbacks do not occur on the user interface thread. System.Windows.Forms.Timerè una scelta migliore da usare con Windows Forms.System.Windows.Forms.Timer is a better choice for use with Windows Forms. Per la funzionalità del timer basata sul server, è possibile System.Timers.Timerconsiderare l'utilizzo di, che genera eventi e dispone di funzionalità aggiuntive.For server-based timer functionality, you might consider using System.Timers.Timer, which raises events and has additional features.

Costruttori

Timer(TimerCallback) Timer(TimerCallback) Timer(TimerCallback) Timer(TimerCallback)

Inizializza una nuova istanza della classe Timer con un periodo e un' ora di esecuzione infiniti, utilizzando l'oggetto Timer appena creato come oggetto di stato.Initializes a new instance of the Timer class with an infinite period and an infinite due time, using the newly created Timer object as the state object.

Timer(TimerCallback, Object, Int32, Int32) Timer(TimerCallback, Object, Int32, Int32) Timer(TimerCallback, Object, Int32, Int32) Timer(TimerCallback, Object, Int32, Int32)

Consente di inizializzare una nuova istanza della classe Timer utilizzando un integer con segno a 32 bit per specificare l'intervallo di tempo.Initializes a new instance of the Timer class, using a 32-bit signed integer to specify the time interval.

Timer(TimerCallback, Object, Int64, Int64) Timer(TimerCallback, Object, Int64, Int64) Timer(TimerCallback, Object, Int64, Int64) Timer(TimerCallback, Object, Int64, Int64)

Consente l'inizializzazione di una nuova istanza della classe Timer utilizzando integer con segno a 64 bit per misurare gli intervalli di tempo.Initializes a new instance of the Timer class, using 64-bit signed integers to measure time intervals.

Timer(TimerCallback, Object, TimeSpan, TimeSpan) Timer(TimerCallback, Object, TimeSpan, TimeSpan) Timer(TimerCallback, Object, TimeSpan, TimeSpan) Timer(TimerCallback, Object, TimeSpan, TimeSpan)

Consente l'inizializzazione di una nuova istanza della classe Timer utilizzando i valori TimeSpan per misurare gli intervalli di tempo.Initializes a new instance of the Timer class, using TimeSpan values to measure time intervals.

Timer(TimerCallback, Object, UInt32, UInt32) Timer(TimerCallback, Object, UInt32, UInt32) Timer(TimerCallback, Object, UInt32, UInt32) Timer(TimerCallback, Object, UInt32, UInt32)

Consente l'inizializzazione di una nuova istanza della classe Timer utilizzando integer senza segno a 32 bit per misurare gli intervalli di tempo.Initializes a new instance of the Timer class, using 32-bit unsigned integers to measure time intervals.

Proprietà

ActiveCount ActiveCount ActiveCount ActiveCount

Ottiene il numero di timer attualmente attivi.Gets the number of timers that are currently active. Un timer attivo è registrato per essere attivato in un determinato momento nel futuro e non è ancora stato annullato.An active timer is registered to tick at some point in the future, and has not yet been canceled.

Metodi

Change(Int32, Int32) Change(Int32, Int32) Change(Int32, Int32) Change(Int32, Int32)

Modifica l'ora di inizio e l'intervallo tra le chiamate dei metodi di un timer, usando interi con segno a 32 bit per misurare gli intervalli di tempo.Changes the start time and the interval between method invocations for a timer, using 32-bit signed integers to measure time intervals.

Change(Int64, Int64) Change(Int64, Int64) Change(Int64, Int64) Change(Int64, Int64)

Modifica l'ora di inizio e l'intervallo tra le chiamate dei metodi di un timer, usando interi con segno a 64 bit per misurare gli intervalli di tempo.Changes the start time and the interval between method invocations for a timer, using 64-bit signed integers to measure time intervals.

Change(TimeSpan, TimeSpan) Change(TimeSpan, TimeSpan) Change(TimeSpan, TimeSpan) Change(TimeSpan, TimeSpan)

Consente di modificare il tempo di attesa e gli intervalli tra i richiami di un timer utilizzando i valori di TimeSpan per misurare gli intervalli di tempo.Changes the start time and the interval between method invocations for a timer, using TimeSpan values to measure time intervals.

Change(UInt32, UInt32) Change(UInt32, UInt32) Change(UInt32, UInt32) Change(UInt32, UInt32)

Modifica l'ora di inizio e l'intervallo tra le chiamate dei metodi di un timer, usando interi senza segno a 32 bit per misurare gli intervalli di tempo.Changes the start time and the interval between method invocations for a timer, using 32-bit unsigned integers to measure time intervals.

CreateObjRef(Type) CreateObjRef(Type) CreateObjRef(Type) CreateObjRef(Type)

Consente di creare un oggetto che contiene tutte le informazioni rilevanti necessarie per la generazione del proxy utilizzato per effettuare la comunicazione con un oggetto remoto.Creates an object that contains all the relevant information required to generate a proxy used to communicate with a remote object.

(Inherited from MarshalByRefObject)
Dispose() Dispose() Dispose() Dispose()

Consente di rilasciare tutte le risorse utilizzate dall'istanza corrente di Timer.Releases all resources used by the current instance of Timer.

Dispose(WaitHandle) Dispose(WaitHandle) Dispose(WaitHandle) Dispose(WaitHandle)

Consente di rilasciare tutte le risorse utilizzate dall'istanza corrente di Timer segnalando l'ora dell'eliminazione del timer.Releases all resources used by the current instance of Timer and signals when the timer has been disposed of.

DisposeAsync() DisposeAsync() DisposeAsync() DisposeAsync()

Consente di rilasciare tutte le risorse utilizzate dall'istanza corrente di Timer.Releases all resources used by the current instance of Timer.

Equals(Object) Equals(Object) Equals(Object) Equals(Object)

Determina se l'oggetto specificato è uguale all'oggetto corrente.Determines whether the specified object is equal to the current object.

(Inherited from Object)
Finalize() Finalize() Finalize() Finalize()

Consente a un oggetto di effettuare un tentativo di liberare risorse ed eseguire altre operazioni di pulizia prima che venga recuperato da Garbage Collection.Allows an object to try to free resources and perform other cleanup operations before it is reclaimed by garbage collection.

GetHashCode() GetHashCode() GetHashCode() GetHashCode()

Funge da funzione hash predefinita.Serves as the default hash function.

(Inherited from Object)
GetLifetimeService() GetLifetimeService() GetLifetimeService() GetLifetimeService()

Consente di recuperare l'oggetto servizio di durata corrente per controllare i criteri di durata per l'istanza.Retrieves the current lifetime service object that controls the lifetime policy for this instance.

(Inherited from MarshalByRefObject)
GetType() GetType() GetType() GetType()

Ottiene l'oggetto Type dell'istanza corrente.Gets the Type of the current instance.

(Inherited from Object)
InitializeLifetimeService() InitializeLifetimeService() InitializeLifetimeService() InitializeLifetimeService()

Ottiene un oggetto servizio di durata per controllare i criteri di durata per questa istanza.Obtains a lifetime service object to control the lifetime policy for this instance.

(Inherited from MarshalByRefObject)
MemberwiseClone() MemberwiseClone() MemberwiseClone() MemberwiseClone()

Crea una copia superficiale dell'oggetto Object corrente.Creates a shallow copy of the current Object.

(Inherited from Object)
MemberwiseClone(Boolean) MemberwiseClone(Boolean) MemberwiseClone(Boolean) MemberwiseClone(Boolean)

Crea una copia dei riferimenti dell'oggetto MarshalByRefObject corrente.Creates a shallow copy of the current MarshalByRefObject object.

(Inherited from MarshalByRefObject)
ToString() ToString() ToString() ToString()

Restituisce una stringa che rappresenta l'oggetto corrente.Returns a string that represents the current object.

(Inherited from Object)

Si applica a

Thread safety

Questo tipo è thread-safe.This type is thread safe.

Vedi anche