アイテムが並行して処理されている ConcurrentBagurls
があります (コレクションには何も書き戻されていません)。
urls.AsParallel<UrlInfo>().WithDegreeOfParallelism(17).ForAll( item =>
UrlInfo info = MakeSynchronousWebRequest(item);
(myProgress as IProgress<UrlInfo>).Report(info);
});
Web リクエストでタイムアウトを 30 秒に設定しています。応答が非常に遅い URL に遭遇すると、すべての並列処理が停止します。これは予期された動作ですか、それともコード内の問題を検索する必要がありますか?
進行状況は次のとおりです。
myProgress = new Progress<UrlInfo>( info =>
{
Action action = () =>
{
Interlocked.Increment(ref itested);
if (info.status == UrlInfo.UrlStatusCode.dead)
{
Interlocked.Increment(ref idead);
this.BadUrls.Add(info);
}
dead.Content = idead.ToString();
tested.Content = itested.ToString();
};
try
{
Dispatcher.BeginInvoke(action);
}
catch (Exception ex)
{
}
});