我有一个
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方法,则不需要执行此操作.任务<对象>语法始终指的是使用新任务启动的方法的返回类型.