如何使用多线程发送 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? 的相关文章

  • 格式说明符%02x

    我有一个简单的程序 include
  • 是否需要销毁运算符删除的形式才能真正销毁对象?

    C 20 添加了破坏形式operator delete区别于std destroying delete t范围 它导致delete表达式在调用之前不再销毁对象operator delete 目的是在显式调用对象的析构函数和释放内存之前 允许
  • C#.Net 邮件将进入垃圾邮件文件夹

    我正在从 ASP net Web 应用程序发送电子邮件 邮件发送成功 没有失败 但大多数都进入了垃圾邮件文件夹 请帮助我克服垃圾邮件过滤器 我的发送邮件代码 public void SendMail string FromAddress s
  • 为什么 C 程序使用 Scanf 给出奇怪的输出?

    我目前正在学习 C 编程 并且遇到了这个奇怪的输出 Program will try functionalities of the scanf function include
  • 在 C++ 代码中转换字符串

    我正在学习 C 并开发一个项目来练习 但现在我想在代码中转换一个变量 字符串 就像这样 用户有一个包含 C 代码的文件 但我希望我的程序读取该文件并插入将其写入代码中 如下所示 include
  • Boost ASIO 串行写入十六进制值

    我正在使用 ubuntu 通过串行端口与设备进行通信 所有消息都必须是十六进制值 我已经在 Windows 环境中使用白蚁测试了通信设置 并得到了我期望的响应 但在使用 Boost asio 时我无法得到任何响应 以下是我设置串口的方法 b
  • 2个对象,完全相同(除了命名空间)c#

    我正在使用第三方的一组网络服务 但遇到了一个小障碍 在我手动创建将每个属性从源复制到目标的方法之前 我想我应该在这里寻求更好的解决方案 我有 2 个对象 一个是 Customer CustomerParty 类型 另一个是 Appointm
  • MVC 5 中具有 ASP.NET Identity 的 Autofac 不会验证 OWIN 管道中的安全标记

    我在 MVC 5 中设置了 AutoFac 来与 ASP NET Identity 一起使用 表面上一切似乎都工作正常 即用户可以创建帐户并登录 但后来我发现 当安全标记更改时 用户不会注销 通过在 AspNetUsers 表中进行暴力破解
  • 来自嵌入图像的 BitmapSource

    我的目标是在 WPF 窗口上重写 OnRender 方法中绘制图像 someImage png 它是嵌入资源 protected override void OnRender System Windows Media DrawingCont
  • LinkLabel 无下划线 - Compact Framework

    我正在使用 Microsoft Compact Framework 开发 Windows CE 应用程序 我必须使用 LinkLabel 它必须是白色且没有下划线 因此 在设计器中 我将字体颜色修改为白色 并在字体对话框中取消选中 下划线
  • C# 获取数据表中所有重复行的计数

    我通过运行存储过程来填充数据集 并且从数据集中填充数据表 DataSet RawDataSet DataAccessHelper RunProcedure storedprocedureName this will just return
  • 在 azure blob 存储中就地创建 zip 文件

    我将文件存储在 Blob 存储帐户内的一个容器中 我需要在第二个容器中创建一个 zip 文件 其中包含第一个容器中的文件 我有一个使用辅助角色和 DotNetZip 工作的解决方案 但由于 zip 文件的大小最终可能达到 1GB 我担心在进
  • 让网络摄像头在 OpenCV 中工作

    我正在尝试让我的网络摄像头在 Windows 7 64 位中的 OpenCV 版本 2 2 中捕获视频 但是 我遇到了一些困难 OpenCV 附带的示例二进制文件都无法检测到我的网络摄像头 最近我发现这篇文章表明答案在于重新编译一个文件 o
  • 如何从 Boost.PropertyTree 复制子树

    我有一些boost property tree ptree 我需要树来删除一些具有特定标签名称的元素 例如 xml 表示源ptree如下
  • 当Model和ViewModel一模一样的时候怎么办?

    我想知道什么是最佳实践 我被告知要始终创建 ViewModel 并且永远不要使用核心模型类将数据传递到视图 这就说得通了 让我把事情分开 但什么是Model 和ViewModel一模一样 我应该重新创建另一个类还是只是使用它 我觉得我应该重
  • Xamarin Forms Binding - 访问父属性

    我无法访问页面的 ViewModel 属性以便将其绑定到 IsVisible 属性 如果我不设置 BindingContext 我只能绑定它 有没有办法可以在设置 BindingContext 的同时访问页面的 viewmodel root
  • 在哪里可以找到 Microsoft.Build.Utilities.v3.5

    如何获取 Microsoft Build Utilities v3 5 我正在使用 StyleCop 4 7 Stylecop dll 中的 StyleCop msbuild 任务似乎依赖于 Microsoft Build Utilitie
  • 如何高效计算连续数的数字积?

    我正在尝试计算数字序列中每个数字的数字乘积 例如 21 22 23 98 99 将会 2 4 6 72 81 为了降低复杂性 我只会考虑 连续的数字 http simple wikipedia org wiki Consecutive in
  • 如果将变量设置为等于新对象,旧对象会发生什么?

    假设我们有一个 X 类not有一个超载的operator 功能 class X int n X n 0 X int n n n int main X a 1 an object gets constructed here more code
  • 如果找不到指定的图像文件,显示默认图像的最佳方式?

    我有一个普通的电子商务应用程序 我将 ITEM IMAGE NAME 存储在数据库中 有时经理会拼错图像名称 为了避免 丢失图像 IE 中的红色 X 每次显示产品列表时 我都会检查服务器中是否有与该产品相关的图像 如果该文件不存在 我会将其

随机推荐

  • .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