好的。所以,我首先要道歉,因为我知道有很多关于Parallel和异步的问题。然而,即使在搜索之后,我也无法思考该如何工作。编码是我涉足的东西,而不是我日复一日地做的事情。
我试图帮助一个朋友使用AlphaVantage API收集一些历史性的股票数据。
我没有问题,收集数据,并将其保存到数据库,但它可能需要很长时间来拉动20年的每日价格。因此,为了避免GUI冻结,我使它成为一个异步函数。然而,考虑到每隔多长时间和需要提取多少数据,就需要并行进行。我还不确定有多少并行事件,但长期目标是在应用程序中有一个计时器,该计时器每隔一段时间启动并调用BatchUpdateStockHistoryAsync方法,并传入一个值,用于在此批中提取和更新多少库存,然后函数将退出,查询DB并获得具有最古老更新的列表5。
目前,我把所有这些都去掉了,只是简单地回答了这个问题,然后创建了一个手动列表,列出了5只股票,这些股票都会被迭代。对于列表中的每一个股票,它都调用另一个函数PullAndWriteHistoricDailyData(item),它完成了实际向AlphaVantage扩展和更新DB的所有工作。
在这个冗长的信息之后,我的问题是,什么是触发PullAndWriteHistoricDailyData()的多个并发线程的最佳方法?
我想我也需要和MaxDegreeOfParallelism一起玩,找出什么是最好的,但我还没有走那么远。我想我可能会想使用Parallel.ForEachAsync?只是不知道怎么把这一切都搞清楚。
任何帮助都将不胜感激。
米秀
public async Task BatchUpdateStockHistoryAsync()
{
List<string> list = new List<string>();
list.Add("AAPL");
list.Add("F");
list.Add("MSFT");
list.Add("COKE");
list.Add("IAG");
foreach(string item in list)
{
await Task.Run(() => PullAndWriteHistoricDailyData(item));
}
return completed;
}发布于 2022-04-08 17:06:49
编辑我错误地读到了最初关于Task.WhenAll与Parallel.ForEach的文章。在阅读了关于Parallel.ForEachAsync的更多信息之后,根据Theodore Zoulias在:is-parallel-foreachasync-a-replacement-to-a-plain-for-loop-append-to-task-list上的答案,并基于以下假设,您希望查看每个任务的结果,即每个任务的目的是接收来自对Parallel.ForEachAsync的调用的单个任务,那么我将建议改为使用以下内容:
您可以切换到使用List<Task>,使用await Task.WhenAll()并跳过Parallel.ForEachAsync,如下所示:
List<Task> myupdatetasks = new List<Task>();
foreach(string item in list)
{
myupdatetasks.Add(Task.Run(() => PullAndWriteHistoricDailyData(item)));
}
await Task.WhenAll(myupdatetasks).ConfigureAwait(false);如果PullAndWriteHistoricDailyData()已经是一个async方法,您不需要使用Task.Run,您可以执行与上面减去Task.Run相同的操作
List<Task> myupdatetasks = new List<Task>();
foreach(string item in list)
{
myupdatetasks.Add(PullAndWriteHistoricDailyData(item));
}
await Task.WhenAll(myupdatetasks).ConfigureAwait(false);如果您打算使用Parallel.ForEachAsync,那么本文将很好地解释它:并行-in 6
https://stackoverflow.com/questions/71800786
复制相似问题