SpinWait SpinWait SpinWait SpinWait Struct

Definición

Proporciona compatibilidad con la espera basada en ciclos.Provides support for spin-based waiting.

public value class SpinWait
public struct SpinWait
type SpinWait = struct
Public Structure SpinWait
Herencia

Ejemplos

En el ejemplo siguiente se muestra cómo usar SpinWaitun:The following example shows how to use a SpinWait:

using System;
using System.Threading;
using System.Threading.Tasks;

class SpinWaitDemo
{
    // Demonstrates:
    //      SpinWait construction
    //      SpinWait.SpinOnce()
    //      SpinWait.NextSpinWillYield
    //      SpinWait.Count
    static void Main()
    {
        bool someBoolean = false;
        int numYields = 0;

        // First task: SpinWait until someBoolean is set to true
        Task t1 = Task.Factory.StartNew(() =>
        {
            SpinWait sw = new SpinWait();
            while (!someBoolean)
            {
                // The NextSpinWillYield property returns true if
                // calling sw.SpinOnce() will result in yielding the
                // processor instead of simply spinning.
                if (sw.NextSpinWillYield) numYields++;
                sw.SpinOnce();
            }

            // As of .NET Framework 4: After some initial spinning, SpinWait.SpinOnce() will yield every time.
            Console.WriteLine("SpinWait called {0} times, yielded {1} times", sw.Count, numYields);
        });

        // Second task: Wait 100ms, then set someBoolean to true
        Task t2 = Task.Factory.StartNew(() =>
        {
            Thread.Sleep(100);
            someBoolean = true;
        });

        // Wait for tasks to complete
        Task.WaitAll(t1, t2);
    }
}
Imports System.Threading
Imports System.Threading.Tasks

Module SpinWaitDemo
    ' Demonstrates:
    ' SpinWait construction
    ' SpinWait.SpinOnce()
    ' SpinWait.NextSpinWillYield
    ' SpinWait.Count
    Private Sub SpinWaitSample()
        Dim someBoolean As Boolean = False
        Dim numYields As Integer = 0

        ' First task: SpinWait until someBoolean is set to true
        Dim t1 As Task = Task.Factory.StartNew(
            Sub()
                Dim sw As New SpinWait()
                While Not someBoolean
                    ' The NextSpinWillYield property returns true if
                    ' calling sw.SpinOnce() will result in yielding the
                    ' processor instead of simply spinning.
                    If sw.NextSpinWillYield Then
                        numYields += 1
                    End If
                    sw.SpinOnce()
                End While

                ' As of .NET Framework 4: After some initial spinning, SpinWait.SpinOnce() will yield every time.
                Console.WriteLine("SpinWait called {0} times, yielded {1} times", sw.Count, numYields)
            End Sub)

        ' Second task: Wait 100ms, then set someBoolean to true
        Dim t2 As Task = Task.Factory.StartNew(
            Sub()
                Thread.Sleep(100)
                someBoolean = True
            End Sub)

        ' Wait for tasks to complete
        Task.WaitAll(t1, t2)
    End Sub

End Module

Comentarios

SpinWaitencapsula la lógica de giro común.SpinWait encapsulates common spinning logic. En los equipos con un solo procesador, los rendimientos siempre se usan en lugar de las esperas ocupadas y en los equipos con procesadores Intel que emplean la tecnología Hyper-Threading, ayudan a evitar el colapso de subprocesos de hardware.On single-processor machines, yields are always used instead of busy waits, and on computers with Intel processors employing Hyper-Threading technology, it helps to prevent hardware thread starvation. SpinWait encapsula una buena mezcla de giro y rendimiento verdadero.SpinWait encapsulates a good mixture of spinning and true yielding.

SpinWaites un tipo de valor, lo que significa que el código de bajo nivel puede emplear SpinWait sin temor a las sobrecargas de asignación innecesarias.SpinWait is a value type, which means that low-level code can utilize SpinWait without fear of unnecessary allocation overheads. SpinWait no suele ser útil para las aplicaciones normales.SpinWait is not generally useful for ordinary applications. En la mayoría de los casos, debe usar las clases de sincronización proporcionadas por el Monitor.NET Framework, como.In most cases, you should use the synchronization classes provided by the .NET Framework, such as Monitor. En la mayoría de los casos en los SpinWait Thread.SpinWait que se requiere la espera de giro, sin embargo, se debe preferir el tipo al método.For most purposes where spin waiting is required, however, the SpinWait type should be preferred over the Thread.SpinWait method.

Propiedades

Count Count Count Count

Obtiene el número de veces que se ha llamado a SpinOnce() en esta instancia.Gets the number of times SpinOnce() has been called on this instance.

NextSpinWillYield NextSpinWillYield NextSpinWillYield NextSpinWillYield

Obtiene si la llamada siguiente a SpinOnce() da paso al procesador, lo que activa un cambio de contexto forzado.Gets whether the next call to SpinOnce() will yield the processor, triggering a forced context switch.

Métodos

Reset() Reset() Reset() Reset()

Restablece el contador de ciclos.Resets the spin counter.

SpinOnce() SpinOnce() SpinOnce() SpinOnce()

Realiza un único ciclo.Performs a single spin.

SpinOnce(Int32) SpinOnce(Int32) SpinOnce(Int32) SpinOnce(Int32)

Realiza una sola rotación y llama a Sleep(Int32) después de un recuento de rotación mínimo.Performs a single spin and calls Sleep(Int32) after a minimum spin count.

SpinUntil(Func<Boolean>) SpinUntil(Func<Boolean>) SpinUntil(Func<Boolean>) SpinUntil(Func<Boolean>)

Itera en ciclos hasta que se satisface la condición especificada.Spins until the specified condition is satisfied.

SpinUntil(Func<Boolean>, Int32) SpinUntil(Func<Boolean>, Int32) SpinUntil(Func<Boolean>, Int32) SpinUntil(Func<Boolean>, Int32)

Itera en ciclos hasta que se satisface la condición especificada o se agota el tiempo de espera indicado.Spins until the specified condition is satisfied or until the specified timeout is expired.

SpinUntil(Func<Boolean>, TimeSpan) SpinUntil(Func<Boolean>, TimeSpan) SpinUntil(Func<Boolean>, TimeSpan) SpinUntil(Func<Boolean>, TimeSpan)

Itera en ciclos hasta que se satisface la condición especificada o se agota el tiempo de espera indicado.Spins until the specified condition is satisfied or until the specified timeout is expired.

Se aplica a

Seguridad para subprocesos

Aunque SpinWait está diseñado para usarse en aplicaciones simultáneas, no está diseñado para su uso simultáneo de varios subprocesos.While SpinWait is designed to be used in concurrent applications, it is not designed to be used from multiple threads concurrently. SpinWaitlos miembros no son seguros para subprocesos.SpinWait members are not thread-safe. Si varios subprocesos deben girar, cada uno debe utilizar su SpinWaitpropia instancia de.If multiple threads must spin, each should use its own instance of SpinWait.

Consulte también: