我有一个方法尝试从并行的几个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