【问题标题】:Threading when sending emails发送电子邮件时的线程
【发布时间】:2013-01-30 19:01:19
【问题描述】:

我有一个发送电子邮件的简单函数,我将如何使用线程来加快电子邮件传递速度?

示例代码将是理想的。

【问题讨论】:

  • 有完整源代码的最终解决方案吗?

标签: c# multithreading email


【解决方案1】:

使用 SendAsync 代替。

【讨论】:

  • 您仍然只能发送 1 个异步。每个 Smtp 客户端一次发送电子邮件(如果还有另一个仍在进行中,它不会让您调用它)。因此,当从一个客户发送大量电子邮件时,这条路线并不是很有帮助。如果您说然后使用多个客户端,那么异步实际上只会加快速度,因为您可以创建客户端并告诉他们发送...更好的选择:创建线程,为每个客户端创建一个客户端,并使用常规的 Send() .至少在我的测试中,线程最终是更快的选择,当然它也取决于硬件。
  • Le function is poop... "调用 SendAsync 后,您必须等待电子邮件传输完成,然后才能尝试使用 Send 或 SendAsync 发送另一封电子邮件。"
【解决方案2】:

查看以下链接以获取 sendAsync 方法的演示。 [MSDN]

http://msdn.microsoft.com/en-ca/library/x5x13z6h(VS.80).aspx

【讨论】:

  • Le function is poop... "调用 SendAsync 后,您必须等待电子邮件传输完成,然后才能尝试使用 Send 或 SendAsync 发送另一封电子邮件。"
【解决方案3】:

您可以在另一个线程中运行该函数。作为 SendMail 您的邮件发件人功能,您可以:

ThreadPool.QueueUserWorkItem(delegate { SendMail(message); });

【讨论】:

    【解决方案4】:

    在 4.0 中你可以使用以下,

    new Thread(x => SendMail(message)).Start();
    

    public static void SendEmail(MailMessage message)
    {
        using (SmtpClient client = new SmtpClient("smtp.XXXXXX.com"))
        {
            client.Send(message);
        }
    }
    

    【讨论】:

      【解决方案5】:

      使用静态 void 方法创建您的类,这将使您的类开始在单独的线程上执行您想要执行的操作,例如:

      using System;
      using System.Threading;
      
      class Test
      {
          static void Main() 
          {
              Thread newThread =  new Thread(new ThreadStart(Work.DoWork));
              newThread.Start();
          }
      }
      
      class Work 
      {
          Work() {}
          public static void DoWork() {}
      }
      

      如果您不想自己管理线程,另一种选择是使用 ThreadPool 类。

      有关线程的更多信息 - http://msdn.microsoft.com/en-us/library/xx3ezzs2.aspx

      关于 ThreadPool 的更多信息 - http://msdn.microsoft.com/en-us/library/3dasc8as(VS.80).aspx

      【讨论】:

        【解决方案6】:

        但是,拥有单独的线程不会加快电子邮件的传递速度。它所要做的就是更快地将控制权返回给调用方法。所以除非你需要这样做,否则我什至不会打扰它。

        【讨论】:

        • 如果您要发送多封电子邮件,您不想让用户等待很长时间。
        【解决方案7】:

        当您使用多个线程发送电子邮件时,请注意不要被您的 isp 识别为垃圾邮件。最好选择较小的批次,每批次之间有一些延迟。

        【讨论】:

          【解决方案8】:

          您知道更好更容易的是创建一个应用程序后端并每 30 分钟发送一次电子邮件。将信息放入您需要发送到那里和从那里发送出去的数据库中,创建一个每 30 分钟启动一次的应用程序池。当它启动时,您可以发送电子邮件。无需等待您的事件处理程序发送电子邮件...

          它对我们有用。只是觉得它会对你有所帮助。

          【讨论】:

            猜你喜欢
            • 2018-09-22
            • 2012-03-29
            • 2015-01-18
            • 1970-01-01
            • 2012-03-21
            • 2018-05-10
            • 1970-01-01
            • 2013-12-02
            • 2021-09-19
            相关资源
            最近更新 更多