API TFS 2010 - перебор списка наборов изменений, возвращаемых в QueryHistory, слишком медленный - PullRequest
4 голосов
/ 01 марта 2011

Короче говоря.После профилирования эта команда занимает 0,1% обработки

var ChangesetList = TFSConnection.GetInstance().GetVersionControl().QueryHistory
    (Path, VersionSpec.Latest,0, RecursionType.Full, "", null, 
    VersionSpec.Latest, Int32.MaxValue,true, false);

, 65,7%.(забавно, вся внутренняя обработка занимает всего 3%)

foreach (Changeset changeset in ChangesetList)

Требуется несколько секунд, пока я не получу свой список ... Что происходит?Почему это так медленно перебирает список?

Есть ли более быстрый способ сделать это?

Редактировать: Плюс, почему я не могу преобразовать его непосредственно в List<Changeset>?

Ответы [ 3 ]

10 голосов
/ 01 марта 2011

Вызов VersionControlServer.QueryHistory возвращает IEnumerable, поэтому я предполагаю, что это похоже на LINQ to Objects, и фактический запрос выполняется, как только вы перебираете IEnumerable (ключевое слово: отложенное выполнение).

Вы не можете присвоить результат списку, поскольку возвращаемое значение не является универсальной версией IEnumerable. Вызов Cast<Changeset>() или OfType<Changeset>() для результата возвращает универсальный IEnumerable<Changeset>. После этого вы можете позвонить ToList() и получить List<Changeset>. ToList() перебирает IEnumerable<T>, так что это как foreach и занимает большую часть времени.

Методы, которые я упомянул, являются методами расширения и находятся в пространстве имен System.Linq.

4 голосов
/ 01 марта 2011

QueryHistory загружает ленивую коллекцию. То есть он фактически не выполняет ваш запрос, пока вы не попытаетесь выполнить его итерацию.

1 голос
/ 02 августа 2012

логическое «включить изменения» требует времени ... Если вы не включаете изменения и только метаданные наборов изменений, запрос выполняется очень быстро

, поэтому запрос должен выглядеть так:

var ChangesetList = TFSConnection.GetInstance().GetVersionControl().QueryHistory     (Path, VersionSpec.Latest,0, RecursionType.Full, "", null, VersionSpec.Latest, Int32.MaxValue,**false,** false); 
...