Compartir a través de


SpinWait Estructura

Definición

Proporciona compatibilidad para la espera basada en ciclos.

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

Ejemplos

En el ejemplo siguiente se muestra cómo usar :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

SpinWait encapsula la lógica de giro común. En las máquinas de un solo procesador, los rendimientos siempre se usan en lugar de esperas ocupadas, y en equipos con procesadores Intel que emplean tecnología Hyper-Threading, ayuda a evitar el colapso de subprocesos de hardware. SpinWait encapsula una buena mezcla de giro y rendimiento verdadero.

SpinWait es un tipo de valor, lo que significa que el código de bajo nivel puede usar SpinWait sin temor a sobrecargas de asignación innecesarias. SpinWait no suele ser útil para las aplicaciones normales. En la mayoría de los casos, debe usar las clases de sincronización proporcionadas por .NET Framework, como Monitor. Sin embargo, para la mayoría de los fines en los que se requiere la espera de giro, se debe preferir el SpinWait tipo sobre el Thread.SpinWait método .

Propiedades

Count

Obtiene el número de veces que se ha llamado a SpinOnce() en esta instancia.

NextSpinWillYield

Obtiene si la llamada siguiente a SpinOnce() da paso al procesador, lo que activa un cambio de contexto forzado.

Métodos

Reset()

Restablece el contador de ciclos.

SpinOnce()

Realiza un único ciclo.

SpinOnce(Int32)

Realiza una sola rotación y llama a Sleep(Int32) después de un recuento de rotación mínimo.

SpinUntil(Func<Boolean>)

Itera en ciclos hasta que se satisface la condición especificada.

SpinUntil(Func<Boolean>, Int32)

Itera en ciclos hasta que se satisface la condición especificada o se agota el tiempo de espera indicado.

SpinUntil(Func<Boolean>, TimeSpan)

Itera en ciclos hasta que se satisface la condición especificada o se agota el tiempo de espera indicado.

Se aplica a

Seguridad para subprocesos

Aunque SpinWait está diseñado para usarse en aplicaciones simultáneas, no está diseñado para usarse desde varios subprocesos simultáneamente. SpinWait los miembros no son seguros para subprocesos. Si varios subprocesos deben girar, cada uno debe usar su propia instancia de SpinWait.

Consulte también