异步&任务 - 搜索网站列表

时间:2017-01-14 19:06:08

标签: c# async-await task

我正在尝试创建一个可以异步方式搜索网站列表中的字符串的类。

以下代码正在运行,但我感觉它完全错了:

 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;
        }
    }

尤其是TaskTask的{​​{1}}:var t = new Task<Task<SearchResult>>(() => SearchWebsiteAsync(url, str));

是否有更好的方法(如果可能,没有Parallel,因为我仍然试图了解async-await和任务)

1 个答案:

答案 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对象。

我在这里假设您可以同时获取所有搜索结果。如果该假设不正确,请告诉我。还有其他解决方案。