2011-03-01 2 views
4

Краткая история. После профилирования эта команда принимает 0,1% обработкиAPI TFS 2010 - Итерация через список наборов изменений, возвращаемых в QueryHistory, слишком медленная.

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>?

+0

@Kiquenet Метод QueryHistory из класса 'VersionControlServer' (http://msdn.microsoft.com/en-us/library/microsoft.teamfoundation.versioncontrol.client.versioncontrolserver.queryhistory.aspx). У меня нет полного исходного кода прямо сейчас, но есть много ресурсов для подключения к серверу фундаментов команды (проверьте msdn: http://msdn.microsoft.com/en-us/magazine/jj553516.aspx) –

ответ

10

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

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

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

4

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

1

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

поэтому запрос должен выглядеть следующим образом:

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