单线程与多线程的简单示例(以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服务应用程序是一种长期运行在操作系统后台的程序,它对于服务器环境 ...
随机推荐
- Vim简明教程【CoolShell】(转)
vim的学习曲线相当的大(参看各种文本编辑器的学习曲线),所以,如果你一开始看到的是一大堆VIM的命令分类,你一定会对这个编辑器失去兴趣的.下面的文章翻译自<Learn Vim Progress ...
- 更快的使用你的键盘:AUTOHOTKEY
本文适合于:每天用电脑工作学习的朋友.游戏发烧手指又不灵敏的朋友.希望提高自己使用电脑效率的朋友. 本文将将告诉你AutoHotkey能做什么,并会一步一步地教会你轻易地使用它,但不会教你更多Auto ...
- debian小巧好看的桌面
先看完,不然,你一定会后悔的..不好看,你打我.. sudo apt-get install xfce4 sudo apt-get install xfce4-goodies sudo apt-get ...
- bzoj2067: [Poi2004]SZN
Description String-Toys joint-stock 公司需要你帮他们解决一个问题. 他们想制造一个没有环的连通图模型. 每个图都是由一些顶点和特定数量的边构成. 每个顶点都可以连向 ...
- ajax切换明星头像!
html部分: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...
- 运行Capture.exe找不到cdn_sfl401as.dll
今天运行capture Orcad16.6显示缺少cdn_sfl401as.dll,昨天运行时并没有发现这种情况,回想今天安装了modelsim之后才发生这种情况,于是将modelsim卸载掉,再次启 ...
- 揭开.NET消息循环的神秘面纱(GetMessage()无法取得任何消息,就会进入Idle(空闲)状态,进入睡眠状态(而不是Busy Waiting)。当消息队列不再为空的时候,程序会自动醒过来)
揭开.NET消息循环的神秘面纱(-) http://hi.baidu.com/sakiwer/item/f17dc33274a04df2a9842866 曾经在Win32平台下奋战的程序员们想必记得, ...
- 如何让窗口控件半透明(控件在Paint自己时,首先向主窗口询问,获取主窗口上控件所在区域的背景图)
在网上关于窗口视觉效果,有2个问题被问得最多:第一个是如何让窗口边框有阴影效果?第二个是如何让窗口控件有半透明效果? 对于第一个问题,我们的答案是用双层窗口模拟或是用Layered Window.在X ...
- android 自定义titlebar
首先,修改标题栏的宽度和背景,在style.xml中添加: <style> <item name="android:background">@drawabl ...
- ehci符合USB2.0,uhci,ohci,
uhci ohci ehci他们都是主机控制器的规格,OHCI主要为非PC系统上以及带有SiShe ALi芯片组的 PC主板上的USB芯片,UHCI大多为Intel和Via主板上的USB控制器 ...