加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 08:35:39 所属栏目:百科 来源:网络整理
导读:我有一个 Windows应用程序,我想介绍 TPL功能.方案是我有一个具有Process方法的类,该方法具有传递给它的MailMessages集合,以及当前的IMAP连接(使用AE.Net.Mail). 我想尽可能多地将线程分离到另一个类中的Execute方法,该类接受一个MailMessage项,将MailMessage
我有一个 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方法,则不需要执行此操作.任务<对象>语法始终指的是使用新任务启动的方法的返回类型.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读