gpt4 book ai didi

c# - 在 .NET 中使用 TPL

转载 作者:行者123 更新时间:2023-12-03 05:33:38 27 4
gpt4 key购买 nike

我必须在我的一个应用程序中重构一个相当耗时的流程,经过一些研究后,我认为它非常适合使用 TPL。我想澄清一下我的理解,并询问是否还有其他问题需要考虑。

简而言之,我有一个 Windows 服务,它可以整夜运行并向大约 10000 个用户发送包含数据更新的电子邮件。目前,整个过程大约需要8小时才能完成。我想将其减少到最多 2 小时。

应用程序工作流程遵循以下步骤: 1. 遍历所有用户列表 2. 检查是否需要通知该用户 3. 如果是,则通过调用外部服务创建电子邮件正文 4.发送电子邮件

对代码的分析表明,第 3 步是最耗时的一步,大约需要 3.5 秒才能完成。这意味着,当处理 10000 个用户时,我的应用程序总共等待外部服务响应的时间超过 6 小时!我认为这是一个足以尝试引入一些异步和并行处理的理由。

所以,我的计划是使用 Parallel 类和 ForEach 方法在步骤 1 中迭代用户。据我所知,这应该将每个用户的处理分配到一个单独的线程中,使它们并行运行?进程彼此完全独立,并且每个进程不返回任何值。如果抛出任何异常,它将保留在日志数据库中。至于步骤 3,我想将对外部服务的调用转换为异步调用。据我所知,这将释放线程上的资源,以便并行类可以重用它来开始处理列表中的下一个用户?

我阅读了有关 TPL 的 MS 文档,特别是 Potential Pitfalls in Data and Task Parallelism文档,我唯一不确定的一点是“避免写入共享内存位置”。我使用本地整数来计算已处理的电子邮件总数。至于其他所有内容,我非常肯定它们不适用于我的场景。

我的问题是,目前还没有任何实现。我想要实现的目标是否可能(特别是外部服务调用的异步等待部分)?我是否应该意识到可能影响我的实现的任何其他障碍?有没有更好的方法来改进工作流程?

只是为了澄清我正在使用 .Net v4.0

最佳答案

是的,您可以使用 TPL 来解决您的问题。如果你无法影响你的外部问题,那么这可能是最好的方法。

但是,如果您能让外部来源接受批处理,您就可以获得最大 yield 。因为这个源实际上可以优化性能。现在,您有 10000 条消息需要序列化、发送、处理、接收和反序列化。这是一次就可以完成的事情。此外,如果您的外部来源知道他们将获得多条记录,他们可能能够优化他们所做的工作。

所以底线是:如果您需要本地优化,TPL 就可以。如果您想优化整个流程以获得实际 yield ,请尝试找出您的外部资源是否可以帮助您,因为这是您可以取得一些真正进展的地方。

关于c# - 在 .NET 中使用 TPL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37166362/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com