如何使用多线程发送 MailMessages?

2023-12-06

我希望你们能容忍我在线程方面完全缺乏方向。 我必须实现一个邮件队列处理系统,我必须通过 Windows 服务发送在数据库中排队的电子邮件。

它不是生产者-消费者模式。我一次将 10 行提取到数据表中。 数据表包含序列化的 MailMessage 对象和 SMTP 发送详细信息。如果我必须使用固定数量的线程(比如 6 个线程),现在我将如何从线程中的数据表中获取一行,然后发送邮件并再次返回以查看是否还有剩余的行?

实现此目的的任何简单逻辑都可以,最好使用 C# 中的简单示例。

我正在使用.NET 3.5


由于发送电子邮件是一个 I/O 绑定过程,因此生成线程来发送电子邮件不会实现太多(如果有的话)加速。

如果您使用的是 Windows 一部分的 SMTP 服务器,那么当您“发送”电子邮件时,它实际上并不会立即发送。它位于服务器上的队列中,服务器会尽快发送它们。发送电子邮件实际上是一个缓慢的过程。

我想我想说的是有两种选择:

  1. 只需按顺序发送它们,看看是否满足您的性能要求。
  2. 您可以使用称为“数据并行”的并行编程概念,我已在博客文章中举例说明了它数据并行 – C#/.NET 中的并行编程

基本上,您所做的是,您将获得所有数据(一次性)。原因是批量获取数据也会减慢您的进程,因此如果您对性能感兴趣(这就是我猜测您正在尝试使用线程的原因),那么不要对数据库服务器进行多次往返(这也是 I/O 绑定在两个级别上,网络 I/O 以及磁盘 I/O)。

因此,获取数据,并将其拆分为块或分区。这一切都在我指出的文章中进行了解释。最简单的实现是块的数量等于机器上核心的数量。

每个块由一个线程处理。 当所有线程都完成后,你就完成了。 利用 .NET 4.0 中线程池的新功能(如果您使用 Parallel.For 或 PLINQ 或任务),您将获得一些其他好处,例如“工作窃取”,以进一步加快工作速度。

我认为 Parallel.For/Parallel.ForEach 很适合你。

EDIT

刚刚注意到 .NET 3.5 要求。这些概念仍然适用,但您没有 Parallel.For/ForEach。因此,这里是一个使用线程池并使用数据并行技术的实现(根据我的博客文章修改)。

    private static void SendEmailsUsingThreadPool(List<Recipient> recipients)
    {
      var coreCount = Environment.ProcessorCount;
      var itemCount = recipients.Count;
      var batchSize = itemCount / coreCount;

      var pending = coreCount;
      using (var mre = new ManualResetEvent(false))
      {
        for (int batchCount = 0; batchCount < coreCount; batchCount++)
        {
          var lower = batchCount * batchSize;
          var upper = (batchCount == coreCount - 1) ? itemCount : lower + batchSize;
          ThreadPool.QueueUserWorkItem(st =>
          {
            for (int i = lower; i < upper; i++)
              SendEmail(recipients[i]);
            if (Interlocked.Decrement(ref pending) == 0)
              mre.Set();
          });
        }
        mre.WaitOne();
      }      
    }

    private static void SendEmail(Recipient recipient)
    {
      //Send your Emails here
    }
  }

  class Recipient
  {
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string EmailAddress { get; set; }
  }

因此,获取您的数据并调用 SendEmailUsingThreadPool() 向其传递您的数据。当然不要这样称呼你的方法:)。如果您有 DataSet/DataTable,则只需修改实现即可接受 DataSet/DataTable。此方法负责将数据分区为块,因此您不必担心任何问题。只需调用它即可。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用多线程发送 MailMessages? 的相关文章

  • BASIC 中的 C 语言中的 PeekInt、PokeInt、Peek、Poke 等效项

    我想知道该命令的等效项是什么Peek and Poke 基本和其他变体 用 C 语言 类似PeekInt PokeInt 整数 涉及内存条的东西 我知道在 C 语言中有很多方法可以做到这一点 我正在尝试将基本程序移植到 C 语言 这只是使用
  • 根据属性的类型使用文本框或复选框

    如果我有这样的结构 public class Parent public string Name get set public List
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • 如何从 Visual Studio 将视图导航到其控制器?

    问题是解决方案资源管理器上有 29 个项目 而且项目同时具有 ASP NET MVC 和 ASP NET Web 表单结构 在MVC部分中 Controller文件夹中有大约100个子文件夹 每个文件夹至少有3 4个控制器 视图完全位于不同
  • 随着时间的推移,添加到 List 变得非常慢

    我正在解析一个大约有 1000 行的 html 表 我从一个字符串中添加 10 个字符串 td 每行到一个list td
  • 从经典 ASP 调用 .Net C# DLL 方法

    我正在开发一个经典的 asp 项目 该项目需要将字符串发送到 DLL DLL 会将其序列化并发送到 Zebra 热敏打印机 我已经构建了我的 DLL 并使用它注册了regasm其次是 代码库这使得 IIS 能够识别它 虽然我可以设置我的对象
  • 如何在 C++ 中标记字符串?

    Java有一个方便的分割方法 String str The quick brown fox String results str split 在 C 中是否有一种简单的方法可以做到这一点 The 增强分词器 http www boost o
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • 用于 FTP 的文件系统观察器

    我怎样才能实现FileSystemWatcherFTP 位置 在 C 中 这个想法是 每当 FTP 位置添加任何内容时 我都希望将其复制到我的本地计算机 任何想法都会有所帮助 这是我之前问题的后续使用 NET 进行选择性 FTP 下载 ht
  • 访问外部窗口句柄

    我当前正在处理的程序有问题 这是由于 vista Windows 7 中增强的安全性引起的 特别是 UIPI 它阻止完整性级别较低的窗口与较高完整性级别的窗口 对话 就我而言 我想告诉具有高完整性级别的窗口进入我们的应用程序 它在 XP 或
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • WcfSvcHost 的跨域异常

    对于另一个跨域问题 我深表歉意 我一整天都在与这个问题作斗争 现在已经到了沸腾的地步 我有一个 Silverlight 应用程序项目 SLApp1 一个用于托管 Silverlight SLApp1 Web 的 Web 项目和 WCF 项目
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • 复制目录下所有文件

    如何将一个目录中的所有内容复制到另一个目录而不循环遍历每个文件 你不能 两者都不Directory http msdn microsoft com en us library system io directory aspx nor Dir
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • 为什么 isnormal() 说一个值是正常的,而实际上不是?

    include
  • 用于运行可执行文件的python多线程进程

    我正在尝试将一个在 Windows 上运行可执行文件并管理文本输出文件的 python 脚本升级到使用多线程进程的版本 以便我可以利用多个核心 我有四个独立版本的可执行文件 每个线程都知道要访问它们 这部分工作正常 我遇到问题的地方是当它们
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • 现代编译器是否优化乘以 1 和 -1

    如果我写 template

随机推荐

  • .data 和 cur_data() 之间的区别

    m lt 10 mtcars gt dplyr mutate disp data disp env m 相当于 m lt 10 mtcars gt dplyr mutate disp cur data disp env m 你能举个例子吗c
  • 我可以使浮动共享图标的垂直列表响应不同的屏幕分辨率吗? (含图片)

    我在我的一个博客上使用 addthis 我有垂直浮动列表的新选项 addthis 按钮的代码如下所示 div class addthis toolbox addthis floating style addthis 32x32 style
  • 自动传递路径参数

    我正在建立一个网站 用户可以选择他想要的国家 州和城市 一旦他选择了这些参数 他就会进入如下页面 en example com spain madrid madrid 问题是 每次我想构建一个新的 url 时 我都必须传递这 3 个变量 我
  • SWI-Prolog:将文本原子拆分为字符列表

    非常简单的问题 我知道有很多方法可以分割原子 例如在某些分隔符上分割 示例原子 例如 gt 示例 原子 但是有没有办法分割每个字符 例如 e x a o m 我试过了 atomic list concat List Atom 但这会产生错误
  • 一个块中有多个 try 代码

    我的 try 块中的代码有问题 为了简单起见 这是我的代码 try code a code b if b fails it should ignore and go to c code c if c fails go to d code d
  • 在R中构建单词共现边缘列表

    我有一大块句子 我想构建单词共现的无向边缘列表并查看每个边缘的频率 我看了一下tm包但没有找到类似的功能 有一些我可以使用的包 脚本吗 多谢 注意 单词不与其自身同时出现 出现两次或多次的单词在同一个句子中仅与其他单词同时出现一次 DF s
  • 如何在jquery中正确缓存DOM元素?

    我在从命名空间变量访问缓存的 DOM 元素时遇到一些问题 我的 FeedManager 配置变量是这样的 var FeedManager config feedContainer feedContainer feedUrl http rss
  • 使用 makecert 进行开发 SSL

    这是我的情况 我正在尝试创建一个 SSL 证书 该证书将安装在所有开发人员的计算机上 以及两个内部服务器 一切都是非生产的 我需要做什么来创建一个可以安装在所有这些地方的证书 现在 我使用 Microsoft Visual Studio 8
  • 使用 Jersey 在正文请求中 POST JSON

    我有一个 Java 动态 Web 项目 部署在本地应用程序服务器 Tomcat 7 上 它使用 Jersey 来创建 REST API 我不使用任何构建自动化工具 因此我的库被添加到构建路径中 并且 servlet 被插入到 web xml
  • 使用 Plotly 与 Slider 进行交互式绘图

    如何使用 Plotly 在 Python 中重新创建以下交互式绘图 我的简单示例绘制了一个条形图 其中一列为 x 另一列为 1 x 来自 Mathematica 的 GIF 滑块允许 x 在 0 到 1 之间变化 数学代码 Manipula
  • 如何在嵌套 JSON 值上使用 SwiftyJSON

    我正在调用一个 JSON API 它有几个我需要获取的嵌套值 我使用 SwiftyJSON 来让事情变得更干净一些 对于顶级值 一切似乎都工作正常 但在更深层次的情况下 我得到了可怕的 展开可选值时为零 以下是我使用 Alamofire 进
  • 如何仅解决 chrome - ERR_HTTP2_PROTOCOL_ERROR - 加载图像问题。 ? (2022)

    这种情况仅在最近几天 2022 年 1 月 开始发生 并且仅在 Chrome 中发生 例如 97 0 4692 99 官方版本 64 位 如果我的页面上有 10 多个图像 chrome 会随机无法下载一些图像 原因如下 失败 net ERR
  • 同一页面中的两个jquery分页插件似乎不起作用

    我使用 jquery 分页插件进行分页 如果有一个分页插件对我来说没有问题 但是如果有两个 一个似乎可以工作 但另一个似乎不起作用 这是我的代码 div class pager div br br br div div div class
  • 如何按日期对图库缩略图图像进行排序

    我正在开发一个安卓应用程序 该应用程序从图库中获取所有缩略图 我想按日期对这些缩略图进行排序 但我做不到 请帮我 获取所有图像 Set up an array of the Thumbnail Image ID column we want
  • Web Deploy 3.0 发布时出现令人恼火的 401 错误

    我似乎无法将简单的应用程序部署到我作为管理员的 IIS 服务器 这是我从 VS2010 收到的错误消息 修改域名以保护无辜者 Build started Project HelloWorldWeb Configuration Debug A
  • 保存 WPF 应用程序页面的状态

    我正在 WPF 中创建一个软件 在该软件中 用户可以加载图像并配置地图 基本上 一旦加载 地图的 图像 用户就可以添加其他图像 如宝藏或怪物的图片等 将它们拖放到地图的图像中 当用户关闭软件并重新打开它时 我希望最后打开的图像和添加的 UI
  • 如何在 laravel 中创建从 public/storage 到 storage/app/public 的符号链接?

    我不知道如何创建符号链接 or symlink 我正在 Laravel 5 2 中的文件系统上工作 该文件说我需要创建一个符号链接 from 公共 存储 to 存储 应用 公共将可公开访问的文件保存在一个目录中 如何创建符号链接或符号链接
  • 使用 FFmpeg 时删除连续重复的帧

    有没有什么方法可以使用来检测视频中的重复帧ffmpeg I tried vf标志与select gt scene 0 xxx 用于场景变换 但是 它对我的 情况不起作用 Use the mp抽取过滤器 其目的是 丢弃与前一帧差异不大的帧 以
  • 抑制 Firebase 错误登录失败的signInWithEmailAndPassword

    我正在尝试在 NextJS 中使用 Firebase 身份验证来实现登录功能 尽管登录函数的处理程序中的 catch 语句为空 但使用无效登录详细信息调用该函数会向控制台记录错误 如何禁止 Firebase 将此错误记录到控制台 登录函数处
  • 如何使用多线程发送 MailMessages?

    我希望你们能容忍我在线程方面完全缺乏方向 我必须实现一个邮件队列处理系统 我必须通过 Windows 服务发送在数据库中排队的电子邮件 它不是生产者 消费者模式 我一次将 10 行提取到数据表中 数据表包含序列化的 MailMessage