你如何使用任务分拆大量的"火与忘记"工作?

Phi*_*lly 6 .net c# task-parallel-library

我有一个Windows应用程序,我想引入TPL功能.场景是我有一个类,Process其中包含一个MailMessage传递给它的集合的方法,以及当前的IMAP连接(使用AE.Net.Mail).

我想将尽可能多的线程分离到Execute另一个类中的方法,该方法接受单个MailMessage项目,然后MailMessage分配给DB,然后使用IMAP连接MailMessage从服务器中删除它.

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

我一直在玩,Task<MailMessage>.Factory.StartNew但我真的不知道我在做什么.我似乎无法开始......这是我尝试过的:

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

});
Run Code Online (Sandbox Code Playgroud)

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

Jes*_*ter 4

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

_mms.ForEach(mms => {
    Task.Factory.StartNew(() => ProcessMessage().Execute(mailMessage, imapConn))
});
Run Code Online (Sandbox Code Playgroud)

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

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