SpinWait 结构 
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
为基于自旋的等待提供支持。
public value class SpinWaitpublic struct SpinWaittype SpinWait = structPublic Structure 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。