2013-10-09 1 views
7

Я смотрю на этот кодИспользование AsSequential в целях сохранения порядка

var numbers = Enumerable.Range(0, 20); 
var parallelResult = numbers.AsParallel().AsOrdered() 
    .Where(i => i % 2 == 0).AsSequential(); 

foreach (int i in parallelResult.Take(5)) 
    Console.WriteLine(i); 

AsSequential() предполагается сделать результирующий массив отсортирован. Фактически он сортируется после его выполнения, но если я удалю звонок до AsSequential(), он по-прежнему сортируется (с AsOrdered()).

В чем разница между этими двумя?

+0

Нет никакого «результирующего массива», так как этот пример в книге не использует '.ToArray()' (я полагаю, вы имеете в виду [Программирование на C# экзамен 70-483] (https: //www.microsoftpressstore .com/магазин/экзамен-реф-70-483-программирование-в-с-острым MCSD-9780735676824)). – comecme

ответ

10

AsSequential предназначен только для того, чтобы остановить дальнейшее параллельное выполнение - отсюда и название. Я не уверен, где у вас есть идея, что он «должен сделать отсортированный массив отсортированным». documentation довольно ясно:

Преобразует ParallelQuery в IEnumerable, чтобы принудительно выполнить последовательную оценку запроса.

Как вы говорите, AsOrdered обеспечивает заказ (для этой конкретной последовательности).

+0

Книга, на которую я ссылаюсь, гласит: «Если у вас есть сложный запрос, который может пригодиться при параллельной обработке, но также имеет некоторые части, которые должны выполняться последовательно, вы можете использовать AsSequential для параллельной обработки запроса. сценарий, где это требуется, - это сохранить порядок запроса. В листинге 1-25 показано, как вы можете использовать оператор AsSequential, чтобы убедиться, что метод Take не испортил ваш заказ ». Я проверил вашу ссылку, и вы абсолютно правы. – MaPi

+0

@ user1648371: Звучит как проблема в книге, да. –

+0

[specs] (https://msdn.microsoft.com/en-us/library/dd460680 (v = vs.110) .aspx) говорят, что 'AsSequential' используется для сохранения порядка, установленного предыдущими предложениями. Будет ли он работать только с SQL-запросами? [Specs] (https://msdn.microsoft.com/en-us/library/dd997399 (v = vs.110) .aspx # Anchor_1) также указывают, что 'Take' будет препятствовать тому, чтобы среда выполнения использовала параллелизм. Так книга неправильно или нет? Я смущен. – comecme

2

Я знаю, что это было задано в течение года, но вот мои два цента.

В приведенном примере я думаю, что он использует AsSequential, чтобы следующий оператор запроса (в данном случае оператор Take) выполнялся последовательно.

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

Смежные вопросы