首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Parallel.ForEachAsync需要帮助

Parallel.ForEachAsync需要帮助
EN

Stack Overflow用户
提问于 2022-04-08 16:59:58
回答 1查看 774关注 0票数 0

好的。所以,我首先要道歉,因为我知道有很多关于Parallel和异步的问题。然而,即使在搜索之后,我也无法思考该如何工作。编码是我涉足的东西,而不是我日复一日地做的事情。

我试图帮助一个朋友使用AlphaVantage API收集一些历史性的股票数据。

我没有问题,收集数据,并将其保存到数据库,但它可能需要很长时间来拉动20年的每日价格。因此,为了避免GUI冻结,我使它成为一个异步函数。然而,考虑到每隔多长时间和需要提取多少数据,就需要并行进行。我还不确定有多少并行事件,但长期目标是在应用程序中有一个计时器,该计时器每隔一段时间启动并调用BatchUpdateStockHistoryAsync方法,并传入一个值,用于在此批中提取和更新多少库存,然后函数将退出,查询DB并获得具有最古老更新的列表5。

目前,我把所有这些都去掉了,只是简单地回答了这个问题,然后创建了一个手动列表,列出了5只股票,这些股票都会被迭代。对于列表中的每一个股票,它都调用另一个函数PullAndWriteHistoricDailyData(item),它完成了实际向AlphaVantage扩展和更新DB的所有工作。

在这个冗长的信息之后,我的问题是,什么是触发PullAndWriteHistoricDailyData()的多个并发线程的最佳方法?

我想我也需要和MaxDegreeOfParallelism一起玩,找出什么是最好的,但我还没有走那么远。我想我可能会想使用Parallel.ForEachAsync?只是不知道怎么把这一切都搞清楚。

任何帮助都将不胜感激。

米秀

代码语言:javascript
复制
    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;
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-08 17:06:49

编辑我错误地读到了最初关于Task.WhenAllParallel.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,如下所示:

代码语言:javascript
复制
 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相同的操作

代码语言:javascript
复制
 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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71800786

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档