SpinWait Yapı

Tanım

Döndürme tabanlı bekleme için destek sağlar.

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

Örnekler

Aşağıdaki örnek, bir SpinWait'in nasıl kullanılacağını göstermektedir.

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

Açıklamalar

SpinWait yaygın dönen mantığı kapsüller. Tek işlemcili makinelerde verimler her zaman meşgul beklemeler yerine kullanılır ve Hyper-Threading teknolojisi kullanan Intel işlemcilere sahip bilgisayarlarda donanım iş parçacığının aç kalmamasını önlemeye yardımcı olur. SpinWait, iyi bir iplik ve gerçek verim karışımını kapsüller.

SpinWait bir değer türüdür; bu da düşük düzeyli kodun gereksiz ayırma ek yüklerinden korkmadan SpinWait'i kullanabileceği anlamına gelir. SpinWait genellikle sıradan uygulamalar için kullanışlı değildir. Çoğu durumda, Monitor gibi .NET Framework tarafından sağlanan eşitleme sınıflarını kullanmanız gerekir. Ancak, çoğunlukla döndürme beklemenin gerekli olduğu durumlarda, SpinWait türü yöntemine Thread.SpinWait göre tercih edilmelidir.

Özellikler

Name Description
Count

Bu örnekte çağrılma sayısını SpinOnce() alır.

NextSpinWillYield

Bir sonraki çağrısının işlemciyi SpinOnce() verip vermeyeceğini alır ve zorlamalı bağlam anahtarını tetikler.

Yöntemler

Name Description
Reset()

Döndürme sayacını sıfırlar.

SpinOnce()

Tek bir döndürme gerçekleştirir.

SpinUntil(Func<Boolean>, Int32)

Belirtilen koşul karşılanana kadar veya belirtilen zaman aşımı süresi dolana kadar döner.

SpinUntil(Func<Boolean>, TimeSpan)

Belirtilen koşul karşılanana kadar veya belirtilen zaman aşımı süresi dolana kadar döner.

SpinUntil(Func<Boolean>)

Belirtilen koşul karşılanana kadar döner.

Şunlara uygulanır

İş Parçacığı Güvenliği

Eşzamanlı uygulamalarda kullanılmak üzere tasarlanmış olsa SpinWait da, birden çok iş parçacığından eşzamanlı olarak kullanılacak şekilde tasarlanmamıştır. SpinWait üyeler iş parçacığı açısından güvenli değildir. Birden çok iş parçacığının dönmesi gerekiyorsa, her biri kendi örneğini SpinWaitkullanmalıdır.

Ayrıca bkz.