Я видел этот код, проверить состояние с помощью AsParallel()
и Any()
: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;
}
I не вижу (явно) - что он действительно заботится о отмена других работников - один раз найдено.
Однако - это (другого) код делает "отделку - как можно скорее" + отменить другую будущую работу:
bool IsAnyDeviceConnected()
{
var res = Parallel.ForEach(m_devices,
(d,loopState) => {
if (d.IsConnected)
loopState.Stop();
});
return !res.IsCompleted;
}
Вопрос:
ли моя диагностика правильно? Any()
- один раз найденный элемент, не отменяет другие потоки (в контексте AsParallel)
nb, мой страх в том, что я могу посмотреть на неправильный исходный код.
Вы смотрите на неправильный источник. Вам нужно посмотреть [ParalellEnumerable.Any] (http://referencesource.microsoft.com/#System.Core/System/Linq/ParallelEnumerable.cs), который намного сложнее, чем то, что вы видите «Enumerable.Any» –