单线程与多线程的简单示例(以Windows服务发短信为示例)
单线程示例:
public delegate void SM();
SM sm = new SM(() =>
{
while (true)
{
//读取发短信列表
if(有数据)
//发短信之后把短信标识改掉,防止重复发短信
else
{
//使用下一个时间间隔唤醒线程
System.Threading.Thread.Sleep(1000); //每秒读取一次
}
}
}
sm.BeginInvoke(null, null);
}
多线程示例:
private Thread thread = null;
protected override void OnStart(string[] args)
{
try
{
thread = new Thread(new ThreadStart(StartSendSmsMessages));
thread.IsBackground = true;
if ((thread != null) && (!thread.IsAlive))
{
Common.WriteLog("当前线程已启动!");
thread.Start();
}
}
catch (Exception ex)
{
Common.WriteLog("开启服务异常为:" + ex.Message);
}
}
private void StartSendSmsMessages()
{
while (true)
{
try
{
DataTable dt = DataToDalorBll.ReadWaitSMSData(SQLConnectionStringResult, string.Format(ReadDataInfo, ReadCount)); //读取待发送短信列表
if (dt != null && dt.Rows.Count > 0)
{
//假设有100个请求线程
int ThreadCount = Convert.ToInt32(SendCount); //SendCount表示线程数量
int BusCount = (int)Math.Ceiling((double)dt.Rows.Count / ThreadCount);//根据行数,线程数设定每个线程要处理的数据量
if (ConnSUM != 0) { ConnSUM = 0; };
System.Diagnostics.Stopwatch sch = new System.Diagnostics.Stopwatch();
sch.Start();
using (var countdown = new MutipleThreadResetEvent(ThreadCount))
{
for (int k = 0; k < BusCount; k++)
{
for (int i = 0; i < ThreadCount; i++)
{
DataRow dr = dt.Rows[i + k * ThreadCount];
Common.WriteLog("当前行数据:" + (i + k * ThreadCount).ToString());
//开启N个线程,传递MutipleThreadResetEvent对象给子线程
ThreadPool.QueueUserWorkItem(new WaitCallback(SendSmsInfo), dr);
countdown.SetOne();
}
Thread.Sleep(Convert.ToInt32(SendSleepTime));
}
//等待所有线程执行完毕
countdown.WaitAll();
//释放空间
countdown.Dispose();
}
sch.Stop();
Common.WriteLog("当前运行时间:" + sch.Elapsed.ToString());
}
else
{
Thread.Sleep(Convert.ToInt32(TimeReadData));
}
}
catch (Exception ex)
{
Common.WriteLog("发送短信异常:" + ex.Message);
Thread.Sleep(Convert.ToInt32(ConnectionTime));
Common.WriteLog("取数出错,即将重新去取数据!");
}
}
}
//发短信方法
private void SendSmsInfo(object obj)
{
//删除待发送列表中的(DataRow)obj中的一条数据
//开始调用发短信方法
//发短信成功后将这条数据和返回值插入已发送列表
}
protected override void OnStop()
{
if ((thread != null) && (thread.IsAlive))
{
Common.WriteLog("当前线程已停止!");
thread.Abort();
}
}
短信的发送主要是以Windows服务为主,调试方法主要以日志的方式进行记录
安装或者卸载服务的方法为:(v4.0.30319为当成程序的编译版本 [(/u)为卸载] 当前程序的bin\Debug\XX.exe)
C:\windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe (/u) E:\DoWeiSendEmailWindowsService\bin\Debug\DoWeiSendEmailWindowsService.exe
单线程与多线程的简单示例(以Windows服务发短信为示例)的更多相关文章
- Zabbix 短信报警示例
Zabbix 短信报警 示例: 注意zabbix 脚本文件默认放置目录是 alertscripts (zabbix 动作调用脚本目录) # 编辑 zabbix_server.conf # AlertS ...
- 向android模拟器打电话发短信的简单方法
在开发android应用程序时,有时候需要测试一下向android手机拨打电话发送短信时该应用程序的反应.譬如编写一个广播接收器,来提示用户有短信收到或者处理短信,就需要向该手机发送短信来进行测试.这 ...
- 第一次发博,发个简单的Java程序发送手机短信验证
最近在准备一个项目,想的登录时候用手机验证,就通过上网查阅了一下手机验证的实现方法,原来超级简单,下面将一步一步介绍. 1.去中国网建注册一个账号密码,首次注册送五条免费短信和3条免费彩信.具体的网址 ...
- 线程:主线程、子线程 同步线程、异步线程 单线程、多线程 System.Threading与System.Windows.Threading
入门-------------------------------------------------------------------------------- 概述与概念 一个C#程序开始 ...
- QT多线程的简单使用,主线程发一份数据,子线程收两份数据
先看效果图,示例发送数据"Hello World" 主线程:0x16f54aeda20,另两个子线程分别是0x4f1baff690.0x4f1baff6a0 因为在子线程中加了20 ...
- 发短信的简单实现——C#版
为了验证操作人的身份,界面中通常会有获取验证码的功能.及点击获取验证码就会往你输入的手机号里面发送一条短信进行验证. 最近公司给我的任务中也包含这个功能,那么接下来就让我讲解下. ---------- ...
- Android开发之短信验证码示例
在说Android中的短信验证码这个知识点前,我们首先来了解下聚合数据 聚合数据介绍 聚合数据是一家国内最大的基础数据API提供商,专业从事互联网数据服务.免费提供从天气查询.空气质量.地图坐标到金融 ...
- windows服务
.net windows 服务创建.安装.卸载和调试 原文:http://www.cnblogs.com/hfliyi/archive/2012/08/12/2635290.html 我对例子做了 ...
- .net windows 服务创建、安装、卸载和调试
原文:http://blog.csdn.net/angle860123/article/details/17375895 windows服务应用程序是一种长期运行在操作系统后台的程序,它对于服务器环境 ...
随机推荐
- TCP/IP-TCP
Don't cry over spilt milk. "覆水难收" 参考资料:TCP/IP入门经典 (第五版) TCP/IP详解 卷一:协议 TCP是协议栈中非常重要的一个部分, ...
- Nginx配置文件nginx.conf详细说明
Nginx配置文件nginx.conf详细说明 #worker_processes 8; #worker_cpu_affinity 00000001 00000010 00000100 0000100 ...
- 78 Subsets(求子集Medium)
题目意思:求解一个数组的所有子集,子集内的元素增序排列eg:[1,3,2] result:[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]思路:这是一个递推的过程 [] ...
- js 鼠标双击滚动单击停止
<!DOCTYPE html> <html> <head> <title>双击滚动代码</title> <script src=&qu ...
- Testlink接口使用方法-python语言远程调用
deepin@deepin-pc:~/test$ cat libclienttestlink.py #!/usr/bin/env python3 # -*- coding: utf-8 -*- #! ...
- window.location.href/replace/reload()--页面跳转+替换+刷新
一.最外层top跳转页面,适合用于iframe框架集 top.window.location.href("${pageContext.request.contextPath}/Login_g ...
- TableView_编辑 实例代码
@interface MJViewController () <UITableViewDataSource, UITableViewDelegate> { NSMutableArray * ...
- 深度学习“引擎”之争:GPU加速还是专属神经网络芯片?
深度学习“引擎”之争:GPU加速还是专属神经网络芯片? 深度学习(Deep Learning)在这两年风靡全球,大数据和高性能计算平台的推动作用功不可没,可谓深度学习的“燃料”和“引擎”,GPU则是引 ...
- 将Map转换为Java 对象
public class MapUtil { public static Object convert2Object(Class clazz,Map<String,Object[]> ma ...
- cf B. Inna and Nine
http://codeforces.com/contest/374/problem/B #include <cstdio> #include <cstring> #includ ...