Aracılığıyla paylaş


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 örnekte, nasıl kullanılacağı gösterilmektedir 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

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 teknolojisini kullanan Intel işlemcileri olan bilgisayarlarda donanım iş parçacığının aç kalmasını önlemeye yardımcı olur. SpinWait, iyi bir dönen 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, gibi .NET Framework Monitortarafından sağlanan eşitleme sınıflarını kullanmanız gerekir. Ancak, döndürme beklemenin gerekli olduğu çoğu amaç için, SpinWait türü yöntemi yerine Thread.SpinWait tercih edilmelidir.

Özellikler

Count

Bu örnekte kaç kez SpinOnce() çağrıldığını alır.

NextSpinWillYield

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

Yöntemler

Reset()

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

SpinOnce()

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

SpinOnce(Int32)

Tek bir döndürme gerçekleştirir ve minimum döndürme sayısının ardından çağrı Sleep(Int32) yapar.

SpinUntil(Func<Boolean>)

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

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.

Şunlara uygulanır

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

eşzamanlı uygulamalarda kullanılmak üzere tasarlanmış olsa SpinWait da, aynı anda birden çok iş parçacığından kullanılmak üzere 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.