SpinWait Struktur
Definisi
Penting
Beberapa informasi terkait produk prarilis yang dapat diubah secara signifikan sebelum dirilis. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.
Menyediakan dukungan untuk menunggu berbasis spin.
public value class SpinWait
public struct SpinWait
type SpinWait = struct
Public Structure SpinWait
- Warisan
Contoh
Contoh berikut menunjukkan cara menggunakan 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
Keterangan
SpinWait merangkum logika spinning umum. Pada mesin prosesor tunggal, hasil selalu digunakan alih-alih menunggu yang sibuk, dan di komputer dengan prosesor Intel yang menggunakan teknologi Hyper-Threading, ini membantu mencegah kelaparan utas perangkat keras. SpinWait merangkum campuran berputar dan hasil yang benar yang baik.
SpinWait adalah jenis nilai, yang berarti bahwa kode tingkat rendah dapat menggunakan SpinWait tanpa takut overhead alokasi yang tidak perlu. SpinWait umumnya tidak berguna untuk aplikasi biasa. Dalam kebanyakan kasus, Anda harus menggunakan kelas sinkronisasi yang disediakan oleh .NET Framework, seperti Monitor. Untuk sebagian besar tujuan di mana spin menunggu diperlukan, namun, SpinWait jenisnya harus lebih disukai Thread.SpinWait daripada metode .
Properti
| Nama | Deskripsi |
|---|---|
| Count |
Mendapatkan berapa kali SpinOnce() telah dipanggil pada instans ini. |
| NextSpinWillYield |
Mendapatkan apakah panggilan berikutnya akan SpinOnce() menghasilkan prosesor, memicu pengalihan konteks paksa. |
Metode
| Nama | Deskripsi |
|---|---|
| Reset() |
Mengatur ulang penghitung putar. |
| SpinOnce() |
Melakukan satu putaran. |
| SpinOnce(Int32) |
Melakukan satu putaran Sleep(Int32) dan panggilan setelah jumlah putaran minimum. |
| SpinUntil(Func<Boolean>, Int32) |
Berputar hingga kondisi yang ditentukan terpenuhi atau hingga batas waktu yang ditentukan kedaluwarsa. |
| SpinUntil(Func<Boolean>, TimeSpan) |
Berputar hingga kondisi yang ditentukan terpenuhi atau hingga batas waktu yang ditentukan kedaluwarsa. |
| SpinUntil(Func<Boolean>) |
Berputar hingga kondisi yang ditentukan terpenuhi. |
Berlaku untuk
Keamanan Thread
Meskipun SpinWait dirancang untuk digunakan dalam aplikasi bersamaan, ini tidak dirancang untuk digunakan dari beberapa utas secara bersamaan. SpinWait anggota tidak aman untuk utas. Jika beberapa utas harus berputar, masing-masing harus menggunakan instansnya sendiri dari SpinWait.