SpinWait 結構
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
提供微調式等候支援。
public value class SpinWait
public struct SpinWait
type SpinWait = struct
Public 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 。