单线程与多线程的简单示例(以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服务应用程序是一种长期运行在操作系统后台的程序,它对于服务器环境 ...
随机推荐
- canvas新属性
lineCap默认值是butt,还有aquare,round 使用:context.lineCap="butt" lineJoin miter是默认 还可以是round,bevel ...
- javascript 读取内联之外的样式(style、currentStyle、getComputedStyle区别介绍) (转载)
样式表有三种方式: 内嵌样式(inline Style) :是写在Tag里面的,内嵌样式只对所有的Tag有效. (也称作“内联样式”) 内部样式(internal Style Sheet):是写在 ...
- JavaScript 学习-变量的作用域和块级作用域
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- iOS开发——OC篇&纯代码退出键盘
关于iOS开发中键盘的退出,其实方法有很多中,而且笔者也也学会了不少,包括各种非纯代码界面的退出. 但是最近开始着手项目的时候却闷了,因为太多了,笔者确实知道有很多中方法能实现,而且令我影响最深的就是 ...
- Dapper中使用存储分页。
#region 分页获取数据 /// <summary> /// 分页获取数据 /// </summary> /// <typeparam name="T&qu ...
- Html表格自动换行
前述: 前端经常用到表格,而表格中的列里面的内容一多,会撑大列的宽度,这个时候如果想要内容不撑大列宽...请看下面的link: link:html表格自动换行
- Android 数据库读取数据显示优化 Application [6]
Application和Activity,Service一样是android框架的一个系统组件, 当android程序启动时系统会创建一个application对象,用来存储系统的一些信息. 通常我们 ...
- iOS 写入文件保存数据的方式
在iOS开发过程中,不管是做什么应用,都会碰到数据保存的问题.将数据保存到本地,能够让程序的运行更加流畅,不会出现让人厌恶的菊花形状,使得用户体验更好.下面介绍一下数据保存的方式: 1.NSKeye ...
- iOS开发网络篇-JSON文件的解析
一.什么是JSON数据 1.JSON的简单介绍 JSON:是一种轻量级的传输数据的格式,用于数据的交互 JSON是javascript语言的一个子集.javascript是个脚本语言(不需要编译),用 ...
- 转:NoSQL更适合担当云数据库吗
在过去几十年,关系型数据库管理系统一直是数据管理的主要模型,随着Web应用数据规模的显著增长,NoSQL系统逐渐引起关注.领域专家Sherif Sakr分析指出,NoSQL具备的优势(能够水平扩展数据 ...