默认情况下,C# 程序具有一个线程。此线程执行程序中以 Main 方法开始和结束的代码。Main 直接或间接执行的每一个命令都由默认线程(或主线程)执行,当 Main 返回时此线程也将终止。不过,可以创建辅助线程,以便与主线程一起并行执行代码。这些线程通常称为“辅助线程”。
多线程处理解决了吞吐量和响应性的问题,但同时也带来了资源共享问题,如死锁和争用状态。多线程特别适用于需要不同资源(如文件句柄和网络连接)的任务。为单个资源分配多个线程可能会导致同步问题,线程会被频繁阻止以等待其他线程,从而与使用多线程的初衷背道而驰。
下面本人分享-如何通过多线程轮询待发送邮件进行发送。实现过程:设计发件箱数据表,配置发件服务器、开发WinForm程序进行发送。
1. 设计发件箱
发件箱记录发送邮件,内容包括-发件人、收件人、邮件标题、邮件内容、增加时间、发送时间及发送失败信息。
2. 发送邮件配置
发送邮件采用C# SMTP协议,需要设置发件人及发送服务器相关信息
3. 实现WinForm 程序
程序界面设计为工具栏、待发送信息,发送情况及显示发送进程信息。程序设计为两个计时器,一个轮询待发送邮件,一个进行邮件发送。
3.1. 读取数据库待发送邮件
使用计时器轮询发件箱,读取待发送邮件。
3.2. 线程发送邮件
使用线程调用发件邮件组件进行邮件发送。
3.3. 邮件发送处理
发送成功后,更新待发送邮件状态为:“已发送”,发送失败时,更新待发送邮件状态为:“待发送”,同时设置下次轮时间为下30分钟。
至此,通过多线程轮询待发送邮件进行邮件发送功能实现分享完毕。多线程在C#开发比较难调试,为此需要对程序发送日志进行详情记录并报告线程执行情况,以便开发人员维护。单独使用线程(Thread)进行发送邮件,很容易造成程序假死,为此,本人采用使用计时器的方式调用线程(Thread)。