【发布时间】:2019-05-28 20:38:44
【问题描述】:
我想在 foreach 中运行几个异步方法。返回值应写入列表。
该方法在 WPF 应用程序中执行。 GetItemPricesFromJsonAsync 方法从网络数据中获取。
public async Task LoadBlackMarketListView(List<MarketAnalysisManager.ItemTier> tiers, List<MarketAnalysisManager.ItemLevel> levels,
List<MarketAnalysisManager.ItemQuality> quialityList, string outdatedHours, string profit, Location? location)
{
await Task.Run(async () =>
{
var blackMarketSellObjectList = new List<BlackMarketSellObject>();
var items = await MarketAnalysisManager.GetItemListAsync(tiers, levels);
await Dispatcher.InvokeAsync(() =>
{
PbBlackMarketMode.Minimum = 0;
PbBlackMarketMode.Maximum = items.Count;
PbBlackMarketMode.Value = 0;
GridBlackMarketMode.IsEnabled = false;
LvBlackMarket.Visibility = Visibility.Hidden;
PbBlackMarketMode.Visibility = Visibility.Visible;
});
foreach (var item in items)
{
var allItemPrices = await MarketAnalysisManager.GetItemPricesFromJsonAsync(item.UniqueName, true);
if (allItemPrices.FindAll(a => a.City == Locations.GetName(Location.BlackMarket)).Count <= 0)
{
await IncreaseBlackMarketProgressBar();
continue;
}
blackMarketSellObjectList.AddRange(await GetBlackMarketSellObjectList(item, quialityList, allItemPrices, outdatedHours, profit, location));
await IncreaseBlackMarketProgressBar();
}
await Dispatcher.InvokeAsync(() =>
{
LvBlackMarket.ItemsSource = blackMarketSellObjectList;
PbBlackMarketMode.Visibility = Visibility.Hidden;
LvBlackMarket.Visibility = Visibility.Visible;
GridBlackMarketMode.IsEnabled = true;
});
});
}
目前看来他一次只做一件事。
运行... 0
结束... 0
运行... 1
结束... 1
运行... 2
结束... 2
【问题讨论】:
-
await 暂停执行,直到等待的任务完成,从而使 foreach 同步运行
-
是的,确实如此,但是如何才能最好地让几件事情并行运行?
-
如果您想继续使用纯异步/等待,请查看my answer。如果您想使用 Parallel 类,请查看this answer by Michal。
-
只是我注意到的一件事.. 你为什么在函数的第一行执行 await Task.Run(async () => ...?我看不出有什么好处给函数带来了另一层嵌套。如果你不这样做并且将所有代码直接放入函数中而没有匿名中间函数,你应该得到完全相同的东西还是我错过了什么?
-
没错@Joelius。感谢您的提示。
标签: c# wpf foreach async-await