我正在尝试创建一个可以异步方式搜索网站列表中的字符串的类。
以下代码正在运行,但我感觉它完全错了:
public static class Searcher
{
public struct SearchResult
{
public SearchResult(string Url, bool Found)
{
this.Url = Url;
this.Found = Found;
}
public string Url;
public bool Found;
}
public async static Task<SearchResult> SearchWebsiteAsync(string url, string str)
{
HttpClient client = new HttpClient();
var urlContents = await client.GetStringAsync(url);
System.Console.WriteLine("Found string in website {0}", url);
bool foundString = (urlContents.Contains(str) ? true : false);
return new SearchResult(url, foundString);
}
public static async Task<IEnumerable<SearchResult>> StartSearch(string str)
{
List<SearchResult> results = new List<SearchResult>();
List<Task<SearchResult>> taskList = new List<Task<SearchResult>>();
foreach (var url in TheWeb.URLs)
{
System.Console.WriteLine("Searching URL {0}", url);
var t = new Task<Task<SearchResult>>(() => SearchWebsiteAsync(url, str));
t.Start();
taskList.Add(t.Result);
}
//Task.WaitAll(tasks.ToArray());
foreach (var task in taskList) {
results.Add(task.Result);
}
return results;
}
}
尤其是Task
内Task
的{{1}}:var t = new Task<Task<SearchResult>>(() => SearchWebsiteAsync(url, str));
是否有更好的方法(如果可能,没有Parallel
,因为我仍然试图了解async-await和任务)
答案 0 :(得分:2)
根据我在您的代码中所理解的,搜索结果来自哪个任务并不重要(因为url
无论如何都包含在您的搜索结果中)。
那怎么样?
public static async Task<SearchResult[]> StartSearch(string str)
{
List<Task<SearchResult>> taskList = new List<Task<SearchResult>>();
foreach (var url in TheWeb.URLs)
{
System.Console.WriteLine("Searching URL {0}", url);
taskList.Add(SearchWebsiteAsync(url, str));
}
return await Task.WhenAll<SearchResult>(taskList);
}
async
个函数返回Task
个对象。您不需要new Task(() => {...})
来初始化它们。只需调用async
函数即可获得有效的Task
对象。
我在这里假设您可以同时获取所有搜索结果。如果该假设不正确,请告诉我。还有其他解决方案。