2011-03-01 26 views
4

ストーリーが短い。プロファイリング後、このコマンドは0.1%の処理を行います。TFS 2010 API - 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)からのものです。私は今、完全なソースコードを持っていませんが、多くのリソースがTeam Foundation Serverに接続しています(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コレクションを遅延ロードします。つまり、それを反復しようとするまで、実際にはクエリは実行されません。

1

ブール値は、変更とクエリが非常に高速であるチェンジセットのメタデータのみが含まれていない場合は...時間がかかっている

ので、クエリは次のようになります「の変更には、」:

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