【发布时间】:2020-09-28 15:31:34
【问题描述】:
在 WPF .net 核心应用中有以下内容:
- 可观察的项目集合 (itemObservCollection)。
- 一个静态的只读 HttpClient _httpclient
- XML 响应
我正在对可观察集合中的每个项目(集合中的 0 到 1000 个项目)的 api 进行 URL 调用。返回是 XML。使用 XElement 解析 XML。可观察集合中的属性值是从 XML 更新的。
Task.Run 用于从 UI 线程运行操作。 Parallel.Foreach 用于进行并行调用。
我觉得我的解决方案过于复杂。有没有办法简化这个?通过单击按钮调用 UpdateItems()。
private async Task UpdateItems()
{
try
{
await Task.Run(() => Parallel.ForEach(itemObservCollection, new ParallelOptions { MaxDegreeOfParallelism = 12 }, async item =>
{
try
{
var apiRequestString = $"http://localhost:6060/" + item.Name;
HttpResponseMessage httpResponseMessage = await _httpclient.GetAsync(apiRequestString);
var httpResponseStream = await httpResponseMessage.Content.ReadAsStreamAsync();
StringBuilder sb = new StringBuilder(1024);
XElement doc = XElement.Load(httpResponseStream);
foreach (var elem in doc.Descendants())
{
if (elem.Name == "ItemDetails")
{
var itemUpdate = itemObservCollection.FirstOrDefault(updateItem => updateItem.Name == item.Name);
if (itemUpdate != null)
{
itemUpdate.Price = decimal.Parse(elem.Attribute("Price").Value);
itemUpdate.Quantity = int.Parse(elem.Attribute("Quantity").Value);
}
}
}
}
catch (Exception ex)
{
LoggerTextBlock.Text = ('\n' + ex.ToString());
}
}));
}
catch (Exception ex)
{
LoggerTextBlock.Text = ('\n' + ex.ToString());
}
}
【问题讨论】:
-
严重 错误是
Parallel.ForEach不处理异步操作,因为这样做没有任何意义。您传递给它的 lambda 本质上是无法等待的async void方法。这段代码几乎同时触发,从不等待它们完成 -
Task.Run is used to run the operation off the UI thread.否,Task.Run 用于在后台线程上运行 -
@Fildor 答案只是“是”,这不是意见。问题只是标题。事实上,我怀疑有几个重复的问题可以回答真正的问题
-
共识似乎是Task.Run和Parallel.ForEach不正确。我将看看 TPL 数据流。感谢@TheodorZoulias、Fildor 和 Panagiotis Kanavos
-
一个错误 - DOP 参数不可见。我可能将值与另一个问题混淆了。 DOP 可以是网络或远程服务器允许的任何内容
标签: c# wpf asynchronous async-await task-parallel-library