单线程与多线程的简单示例(以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服务应用程序是一种长期运行在操作系统后台的程序,它对于服务器环境 ...
随机推荐
- nginx 伪静态大于10个参数 $10
伪静态大于10个参数 会解析成 $1 与 0 参考:http://zhidao.baidu.com/link?url=kT2tp8ARhIZsrt4XF3LdzjkEq0QTIbvhOj9Ck ...
- Day2 数据类型
1.数字:int(整型) 32位机器:-2**31~2**31-1 64位机器:-2**63~2**63-1 float(浮点型) 2.布尔值 真或假 1或0 bool(0) 3.字符串 name = ...
- A记录、CNAME记录、MX记录
A 记录(Address) (一句话:用来指定域名和服务器IP的对应关系) 是用来指定主机名(或域名)对应的IP地址记录.用户可以将该域名下的网站服务器指向到自己的web server上.同时也可以 ...
- 资料Link集合
Spark RDD API详解(一) Map和Reduce| scala中Iterator的比较| 使用sbt构建scala应用| sbt常用命令| sbt更改默认ivy仓库位置| linux手动安 ...
- sql中关于case when的一个例子
SELECT rownum R, a.expert_id as USERID, a.expert_id as TYPE, b.type_desc as TYPE_DESC, a.sex as SEX, ...
- 利用花生壳在自己电脑上建立外网可访问的svn
下载花生壳并注册账号 2.花生壳会送你一个免费的二级域名 3.登陆到路由器界面192.168.0.1或者192.168.0.0进入动态dns选项输入你的花生壳账号密码 4.在路由器设置界面设置转发规则 ...
- CentOS 启动提示unexpected inconsistency;RUN fsck MANUALLY
CentOS这两天服务器出了问题了,提示如下: unexpected inconsistency;RUN fsck MANUALLY An error occurred during the file ...
- (转载)python多行注释
(转载)http://www.cnblogs.com/pylemon/archive/2011/05/23/2054090.html python本身不带多行注释,编辑时每行敲一个“#”相当的不方便, ...
- 【转】VS调试技巧
[转自]http://blog.csdn.net/ghttzsqgm/article/details/5326894 http://blog.csdn.net/cadcisdhht/article/d ...
- 【4】JAVA---地址App小软件(UpdatePanel.class)(表现层)
修改地址信息的一个表现层类. 必须选中地址,才能修改,否则会弹出窗口提示, 修改地址界面: /* * UpdatePanel.java * */ package cn.hncu.addr.ui; im ...