SpinWait 結構

定義

提供微調式等候支援。

public value class SpinWait
public struct SpinWait
type SpinWait = struct
Public Structure SpinWait
繼承
SpinWait

範例

下列範例示範如何使用 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

備註

SpinWait 封裝常見的旋轉邏輯。 在單處理器電腦上,一律會使用產生,而不是忙碌等候,而且在採用Hyper-Threading技術的 Intel 處理器電腦上,有助於防止硬體執行緒耗盡。 SpinWait 會封裝良好的旋轉和真正的產生混合。

SpinWait 是實數值型別,這表示低階程式碼可以利用 SpinWait,而不必擔心不必要的配置額外負荷。 SpinWait 通常不適用於一般應用程式。 在大部分情況下,您應該使用 .NET Framework所提供的同步處理類別,例如 Monitor 。 不過,對於需要微調等候的大多數用途, SpinWait 應該優先使用型別。 Thread.SpinWait

屬性

Count

取得已在這個執行個體上呼叫 SpinOnce() 的次數。

NextSpinWillYield

取得值,這個值表示下一次呼叫 SpinOnce() 時是否讓出處理器,並觸發強制的環境切換。

方法

Reset()

重設微調計數器。

SpinOnce()

執行單一微調。

SpinOnce(Int32)

執行單一微調並在到達最低微調計數後呼叫 Sleep(Int32)

SpinUntil(Func<Boolean>)

執行微調,直到滿足指定的條件為止。

SpinUntil(Func<Boolean>, Int32)

執行微調,直到滿足指定的條件或是指定的逾時過期為止。

SpinUntil(Func<Boolean>, TimeSpan)

執行微調,直到滿足指定的條件或是指定的逾時過期為止。

適用於

執行緒安全性

雖然 SpinWait 設計成用於並行應用程式,但並非設計成要同時從多個執行緒使用。 SpinWait 成員不是安全線程。 如果多個執行緒必須微調,則每個執行緒都應該使用自己的 實例 SpinWait

另請參閱