コードは、公開されたSVNツリーの表現に対してHTTP呼び出しを行っています。次に、HTMLを解析し、後で参照用にファイルを追加して、ユーザーにプルダウンしてプッシュします。これはWPFアプリケーション内で行われています。以下は、コードとディレクトリ構造を示すイメージです。再帰的なHTTP呼び出しは、IDE対展開された実行可能ファイルで異なる動作を示します。
private readonly String _baseScriptURL = @"https://xxxxxxxxxx/svn/repos/xxxxxxxxxx/trunk/scripts/vbs/web/";
private void FindScripts(String url, ref ICollection<String> files)
{
//MyFauxMethod();
StringBuilder output = new StringBuilder();
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Credentials = new Credentials().GetCredentialCache(url);
_logger.Log("Initiating request [" + url + "]", EventType.Debug);
try
{
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
using (Stream stream = response.GetResponseStream())
{
_logger.Log("Response received for request [" + url + "]", EventType.Debug);
int count = 0;
byte[] buffer = new byte[256];
while ((count = stream.Read(buffer, 0, buffer.Length)) > 0)
{
if (count < 256)
{
List<byte> trimmedBuffer = buffer.ToList();
trimmedBuffer.RemoveRange(count, 256 - count);
String data = Encoding.ASCII.GetString(trimmedBuffer.ToArray());
output.Append(data);
}
else
{
String data = Encoding.ASCII.GetString(buffer);
output.Append(data);
}
}
}
String html = output.ToString();
HTMLDocument doc = new HTMLDocumentClass();
IHTMLDocument2 doc2 = (IHTMLDocument2)doc;
doc2.write(new object[] { html });
IHTMLElementCollection ul = doc.getElementsByTagName("li");
doc2.close();
doc.close();
foreach (IHTMLElement item in ul)
{
if (item != null &&
item.innerText != null)
{
String element = item.innerText.Trim().Replace(" ", "%20");
//nothing to do with going up a dir
if (element == "..")
continue;
_logger.Log("Interrogating [" + element + "]", EventType.Debug);
String filename = System.IO.Path.GetFileName(element);
if (String.IsNullOrEmpty(filename))
{
//must be a directory; recursively search if honored dir
if (!_ignoredDirectories.Contains(element))
{
_logger.Log("Searching directory [" + element + "]", EventType.Debug);
FindScripts(url + System.IO.Path.GetDirectoryName(element) + "/", ref files);
}
else
_logger.Log("Ignoring directory [" + element + "]", EventType.Debug);
}
else
{
//add honored files to list for parsing meta data later
if (_honoredExtensions.Contains(System.IO.Path.GetExtension(filename)))
{
files.Add(url + filename);
_logger.Log("Added file [" + (url + filename) + "]", EventType.Debug);
}
}
//MyFauxMethod();
}
//MyFauxMethod();
}
}
catch (Exception e)
{
_logger.Log(e);
}
//MyFauxMethod();
}
private void MyFauxMethod()
{
int one = 1;
int two = 2;
int three = one + two;
}
まずオフ長いコードブロックのための謝罪。しかし私は完全な方法が理解されたことを確かめたいと思った。存在する問題は、IDEの外部で実行可能なリリースリリースを使用する場合にのみ適用されます。 IDE内でリリースビルドを実行すると、問題なく機能します。
さらに、生成されたデバッグをIDEの外部またはIDE内でビルドすると問題は発生しません。両方のシナリオで適切に機能します。
問題は、再帰呼び出しが再帰メソッドを過ぎてもコードを停止してしまうことです。スレッド内で例外はスローされません。他のビルドと同じように、すべてのディレクトリに移動する前にすべてが停止します。リクエスト を開始
このようなリリースビルド見た目のログの行が...
[https://xxxxxxxxx/svn/repos/xxxxxxxxx/trunk/scripts/vbs/web/]
応答が要求 のために受信[https://xxxxxxxxx/svn/repos/xxxxxxxxx/trunk/scripts/vbs/web/]
ディレクトリを検索[BEQ /]
を問い合わせます[beq /]
開始 要求 [https://xxxxxxxxx/svn/repos/xxxxxxxxx/trunk/scripts/vbs/web/beq/]
応答受信VED要求 [https://xxxxxxxxx/svn/repos/xxxxxxxxx/trunk/scripts/vbs/web/beq/]
問い合わせるため[コア/]
は[コア/】
は 要求 を[https://xxxxxxxxx/svn/repos/xxxxxxxxx/trunk/scripts/vbs/web/beq/core/]
レスポンス [BEQコア%20Libraryを問い合わせる要求 [https://xxxxxxxxx/svn/repos/xxxxxxxxx/trunk/scripts/vbs/web/beq/core/]
ために受信 ディレクトリ開始検索します。再帰的にスクリプトがかかっ見つけVBS]
追加要求 を開始 ファイル [https://xxxxxxxxx/svn/repos/xxxxxxxxx/trunk/scripts/vbs/web/beq/core/BEQ-Core%20Library.vbs]
ゲー[1オフ/]ディレクトリを検索
[1オフ/]
[https://xxxxxxxxx/svn/repos/xxxxxxxxx/trunk/scripts/vbs/web/beq/one-offs/]
レスポンスが要求 のために受信[https://xxxxxxxxx/svn/repos/xxxxxxxxx/trunk/scripts/vbs/web/beq/one-offs/]
[0] m [0] s [906] ms [1]
合計時間[0] m [7] s [46] s [ ms
UPDATEは:
デバッグ中に約3追加のログラインに追加した後、それは今それが必要として機能しています。顕著な問題はなぜですか?別のアプリケーションで問題のコードを分離しようとすると、否定的な結果は生じません。
これはなぜ起こっているのでしょうか?
UPDATE:のどのメソッドを呼び出すためにログ行を変更すると、
同じ結果が得られました。私はfauxメソッドとfauxメソッドへの呼び出しを上記のソースに追加しました.1はメソッドのエントリに、3はbottomの近くにあります。呼び出し自体は、場所を特定しやすくするためにコメントされています。彼らはではないは、実際のコードでコメントされています。
私が4つの追加fauxメソッド呼び出しのいずれかをコメントアウトすると、機能しなくなります。これもまたのにCTRL + F5を押すか、またはIDEの外部でのみ行うことができます。
UPDATE:fubaarあたりHtmlDocument
インスタンスに
追加しまし.close();依然として同じ挙動が示されている。
UPDATE:fubaarあたりGCに
を追加しました明示的な呼び出し。依然として同じ挙動が示されている。
競合他のタイミングの問題のように聞こえます。 –
@ Jakubこれはすべて同じワーカースレッドで起こっています。私はそれをUIスレッドに移動し、ログ行が存在しないときと同じ動作を経験しました。私はそれがタイミングの問題であることを知っている、私は可能性がどこに由来する可能性があるかを把握しようとしています。 –