我有一个Windows应用程序,我想向其中引入TPL功能。情况是,我有一个带有Process方法的类,该类具有传递给它的MailMessage的集合以及当前的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实例(例如Task test = ...)的事件,则可以使用Task.Factory.StartNew()在新线程中启动方法执行,这样我们您可以简单地为您要处理的每个邮件启动一个新的任务,并让线程池为我们处理事情。

同样,Task<MailMessage>.Factory.StartNew将用于在另一个返回MailMessage的线程中建立方法调用,因此,如果您正在调用void方法,则不需要这样做。 Task<object>语法始终引用您从新Task开始的方法的返回类型。

关于c# - 您如何使用“任务”衍生出许多 “Fire and Forget”工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13934539/

10-12 00:39