Я видел этот код, который проверяет условие с помощью AsParallel()
и Any()
:
bool IsAnyDeviceConnected()
{
return m_devices.Any(d => d.IsConnected);
}
и чтобы сделать это быстрее:
bool IsAnyDeviceConnected()
{
return m_devices.AsParallel().Any(d => d.IsConnected);
}
Но глядя на Any()
:
internal static bool Any<T>(this IEnumerable<T> source, Func<T, bool> predicate) {
foreach (T element in source) {
if (predicate(element)) {
return true;
}
}
return false;
}
Я не вижу (очевидно), что он действительно заботится о отмене других рабочих процессов - после того, как он обнаружен.
Однако этот (другой) код выполняет «завершение - как можно скорее» + отменяет другие работы в будущем:
bool IsAnyDeviceConnected()
{
var res = Parallel.ForEach(m_devices,
(d,loopState) => {
if (d.IsConnected)
loopState.Stop();
});
return !res.IsCompleted;
}
Вопрос:
Моя диагностика верна? Делает Any()
- однажды найденный элемент не отменяет другие потоки (в контексте AsParallel)
nb, я опасаюсь, что смотрю не на тот исходный код.
Enumerable.Any
- person Sriram Sakthivel   schedule 19.08.2014