我有一个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/