相关疑难解决方法(0)

使用HttpClient和ContinueWith的Paralell.ForEach

我有一个方法尝试从并行的几个URL下载数据,并返回一个IEnumerable反序列化类型

该方法如下所示:

    public IEnumerable<TContent> DownloadContentFromUrls(IEnumerable<string> urls)
    {
        var list = new List<TContent>();

        Parallel.ForEach(urls, url =>
        {
            lock (list)
            {
                _httpClient.GetAsync(url).ContinueWith(request =>
                {
                    var response = request.Result;
                    //todo ensure success?

                    response.Content.ReadAsStringAsync().ContinueWith(text =>
                    {
                        var results = JObject.Parse(text.Result)
                            .ToObject<IEnumerable<TContent>>();

                        list.AddRange(results);
                    });
                });
            }
        });

        return list;
    }
Run Code Online (Sandbox Code Playgroud)

在我的单元测试中(我存根_httpClient返回一组已知的文本)我基本上得到了

序列不包含任何元素

这是因为该方法在任务完成之前返回.

如果我在.ContinueWith()调用结束时添加.Wait(),它会通过,但我确定我在这里滥用了API ...

c# asynchronous task-parallel-library async-await dotnet-httpclient

4
推荐指数
1
解决办法
3503
查看次数