gpt4 book ai didi

c# - 您如何使用 Tasks 分拆大量 "Fire and Forget"工作?

转载 作者:太空狗 更新时间:2023-10-29 21:09:40 27 4
gpt4 key购买 nike

我有一个要介绍的 Windows 应用程序 TPL功能到。场景是我有一个 Process 的类具有 MailMessage 集合的方法s 传递给它,以及当前的 IMAP 连接(使用 AE.Net.Mail)。

我想分拆尽可能多的线程到 Execute另一个类中的方法采用单个 MailMessage项,以及 MailMessage到数据库,然后使用 IMAP 连接删除 MailMessage从服务器。

我不太担心跟踪流程 - 我正在处理大量电子邮件,如果我在写入数据库或删除时遇到一些错误,我并不担心。我只需要应用程序尽快处理大量的 MailMessages。

我一直在玩弄 Task<MailMessage>.Factory.StartNew但我真的不知道我在做什么。我似乎无法启动它...这是我尝试过的方法:

Task test = Task.Factory.StartNew(() =>
{
foreach (var mailMessage in _mms)
{
new ProcessMessage().Execute(mailMessage, imapConn);
}

});

我很确定我不应该在 lamda 表达式中有一个循环,当我运行它时它似乎没有进入 ProcessMessage.Execute .

最佳答案

你绝对不应该在你的 lamdba 表达式中有一个循环。试试这个:

_mms.ForEach(mms => {
Task.Factory.StartNew(() => ProcessMessage().Execute(mailMessage, imapConn))
});

如果您不担心跟踪结果或任何不需要保存任务实例的事情,例如 Task test = ....您可以使用 Task.Factory.StartNew() 在新线程中启动方法执行这样我们就可以简单地为您要处理的每封邮件启动一个新任务,并让线程池为我们处理事情。

此外,Task<MailMessage>.Factory.StartNew 将用于在另一个返回 MailMessage 的线程中设置方法调用,因此如果您正在调用 void 方法,则不需要执行此操作。 Task<object> 语法始终指代您使用新任务启动的方法的返回类型。

关于c# - 您如何使用 Tasks 分拆大量 "Fire and Forget"工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13934539/

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