Прочитать на английском

Поделиться через


SpinWait Структура

Определение

Предоставляет поддержку ожидания на основе прокруток.

public struct 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);
    }
}

Комментарии

SpinWait инкапсулирует общую логику вращения. На однопроцессорных компьютерах доходность всегда используется вместо занятых ожиданий, а на компьютерах с процессорами Intel, используюющими Hyper-Threading технологию, это помогает предотвратить нехватку аппаратных потоков. 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)

Выполняет прокрутки до удовлетворения заданного условия или истечения заданного времени ожидания.

Применяется к

Продукт Версии
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.6, 2.0, 2.1
UWP 10.0

Потокобезопасность

Хотя SpinWait предназначен для использования в параллельных приложениях, он не предназначен для одновременного использования из нескольких потоков. SpinWait элементы не являются потокобезопасны. Если необходимо развернуть несколько потоков, каждый из них должен использовать собственный SpinWaitэкземпляр .

См. также раздел