語言

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 封裝了常見的旋轉邏輯。 在單處理器機器上,總是使用良率取代忙碌等待;而在採用 Intel 處理器且採用 Hyper-Threading 技術的電腦上,這有助於防止硬體執行緒枯竭。 SpinWait 完美結合了紡紗與真實屈服。

SpinWait 是一種值型別,這表示低階程式碼可以利用 SpinWait,而不用擔心不必要的配置開銷。 SpinWait 通常不適用於一般應用。 大多數情況下,你應該使用 .NET Framework 提供的同步類別,例如 Monitor。 然而,在大多數需要自旋等待的場合,應優先採用 SpinWait 這種類型而非方法 Thread.SpinWait 。

屬性

名稱 Description
Count

這次被叫了多少次 SpinOnce() 。

NextSpinWillYield

判斷下一個呼叫 SpinOnce() 是否會產生處理器,觸發強制上下文切換。

方法

名稱 Description
Reset()

重置旋轉計數器。

SpinOnce()

完成一次旋轉。

SpinOnce(Int32)

執行一次旋轉,並在最低旋轉次數後叫牌 Sleep(Int32) 。

SpinUntil(Func<Boolean>, Int32)

旋轉直到指定條件被滿足或逾時結束為止。

SpinUntil(Func<Boolean>, TimeSpan)

旋轉直到指定條件被滿足或逾時結束為止。

SpinUntil(Func<Boolean>)

旋轉直到符合指定條件。

適用於

執行緒安全性

雖然 SpinWait 設計上用於並行應用,但並非設計成可同時從多個執行緒使用。 SpinWait 成員並非執行緒安全。 若多個執行緒必須旋轉,每個執行緒應使用自己的實例。SpinWait

另請參閱