c# – 你如何使用任务来分拆大量的“Fire and Forget”工作?

前端之家收集整理的这篇文章主要介绍了c# – 你如何使用任务来分拆大量的“Fire and Forget”工作?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个 Windows应用程序,我想介绍 TPL功能.方案是我有一个具有Process方法的类,该方法具有传递给它的MailMessages集合,以及当前的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);
  }

});

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

解决方法

你绝对不应该在你的lamdba表达式中有一个循环.试试这个:
_mms.ForEach(mms => {
    Task.Factory.StartNew(() => ProcessMessage().Execute(mailMessage,imapConn))
});

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

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

猜你在找的C#相关文章