SwitchToThread по сравнению со сном (1)

Вы могли использовать массивы CopyTo() метод.

Или с LINQ можно использовать Skip() и Take() ...

byte[] arr = {1, 2, 3, 4, 5, 6, 7, 8};
var subset = arr.Skip(2).Take(2);

16
задан JRL 7 February 2015 в 18:42
поделиться

1 ответ

Есть два отличия. Первый упомянут в документации MSDN для SwitchToThread :

Выход выполнения ограничен процессором вызывающего потока. Операционная система не переключит выполнение на другой процессор, даже если этот процессор простаивает или выполняет поток с более низким приоритетом.

Sleep (0) также разрешает выполнение потоков на других процессорах.

Только SwitchToThread уступает также контексту планирования одного потока. С другой стороны, сон имеет несколько условий, которых он ждет. Документация для SleepEx подробно описывает это:

* An I/O completion callback function is called
* An asynchronous procedure call (APC) is queued to the thread.
* The time-out interval elapses

Это приведет к использованию нескольких потоков.

В общем, Sleep (0) с гораздо большей вероятностью приведет к временному интервалу и ВСЕГДА дает в ОС, даже если нет других ожидающих потоков. Вот почему добавление Sleep (0) в цикл во многих случаях увеличивает использование процессора со 100% (на ядро) почти до 0%. SwitchToThread не будет, если другой поток не ожидает временного отрезка.

23
ответ дан 30 November 2019 в 21:37
поделиться