public static List <SearchResult> BingSearch(string search_expression, int max, Dictionary <string, object> stats_dict) { var url_template = "http://api.search.live.net/json.aspx?AppId=" + Configurator.bing_api_key + "&Market=en-US&Sources=Web&Adult=Strict&Query={0}&Web.Count=50"; var offset_template = "&Web.Offset={1}"; var results_list = new List <SearchResult>(); Uri search_url; List <int> offsets = GenUtils.EveryNth(start: 0, step: 50, stop: max).ToList(); var options = new ParallelOptions(); Parallel.ForEach(source: offsets, parallelOptions: options, body: (offset) => // foreach (var offset in offsets) { if (offset == 0) { search_url = new Uri(string.Format(url_template, search_expression)); } else { search_url = new Uri(string.Format(url_template + offset_template, search_expression, offset)); } var page = CallSearchApi(search_url); if (page == null) { //continue; return; } try { JObject o = (JObject)JsonConvert.DeserializeObject(page); var results_query = from result in o["SearchResponse"]["Web"]["Results"].Children() select new SearchResult ( url: result.Value <string>("Url").ToString() ?? "NoUrl", title: result.Value <string>("Title").ToString() ?? "NoTitle", content: result.Value <string>("Description").ToString() ?? "NoDescription", engine: SearchResult.FindingEngine.bing ); foreach (var result in results_query) { results_list.Add(result); } } catch { GenUtils.PriorityLogMsg("exception", "BingSearch", search_url.ToString()); } } ); return(results_list); }