`
javatoyou
  • 浏览: 1017448 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

ASP.net实现WEB站点的后台定时任务

 
阅读更多
采用Asp.net的定时处理方式,在WEB服务器层处理业务
核心处理就是System.Threading.Timer。这个定时类可以用于在后台定时执行用户提交操作,


它的使用方法:

System.Threading.TimerCallbackt
=newSystem.Threading.TimerCallback(你的处理方法);
System.Threading.Timert
=newSystem.Threading.Timer(t,null,1000,5000);
这一段说明是在启动1秒后每隔5秒就调用所指定的代理。

在具体实现时我定义了三个类。

1、BkExecItem用于保存用户提交操作,同时它也可以序列化到磁盘上,以免关键后台任务丢失。

2、BkExec用于执行。它通过反射来调用BkExecItem中所指定的方法。另外它中间还维护一个先入

先出队列Queue
<BkExecItem>,这个队列记录全部的后台处理项。

3、BkManager完成定时器的初始化,模块的参数配置等功能。

呵,暂时总结到这里。下次我会将代码也贴上来,供大家参考下。

一个实用ASP.Net后台处理类

呵.这回跟大家讨论下ASP.net后台处理,并会把我们当前项目中应用的一个后台处理类的代码贴上来参考.

后台处理也是现在管理系统设计中需要考虑到的一个问题.

什么是后台处理,可以简单认为不是在用户进程处理中完成用户提交的操作,而是将这一处理放到服务端后台进程来处理.

加入后台处理后,可以提高前台用户的操作速度,改善用户操作体验.

对于一般用户来说他对于一个系统的基本要求就是响应及时,用户很难对一个提交操作后需要等待10秒以后的管理系统产生好感,但在实际系统运行中用户操作是很难在短时间内得到响应,所以这个时候后台处理就可以发挥作用了.

我在后面所帖代码中,将需要后台处理的任务均定义成一个ExecItem对象.用户提交操作后,系统将就操作转成一个ExecItem对象加入到BkExecManager(后台处理管理对象)中的一个先入先出的队列中.

网站在启动时会自动启动BkExecManager,而BkExecManager则启动一个定时器来定时处理后台任务队列.

在处理完成时BkExecManager就队列中移去任务对象,如果操作失败将以邮件方式通知管理员来完成问题处理.

呵.现在贴代码
!

1,后台处理管理对象



publicclassBkExecManager
{
//定时回调。
privatestaticTimerCallbacktimerDelegate;
privatestaticTimerstateTimer;
privatestaticBkExecerm_Execer;
publicstaticstringDataPath;
publicstaticstringBkManager="XXXX";
publicstaticintBkBufSize=100;
privatestaticintInterval=10000;

publicstaticBkExecerExecer
{
get{returnm_Execer;}
}


staticBkExecManager()
{
DataPath
=System.AppDomain.CurrentDomain.BaseDirectory+"BkItem/";
if(System.Configuration.ConfigurationManager.AppSettings["Interval"]!=null)
Interval
=Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["Interval"]);

if(System.Configuration.ConfigurationManager.AppSettings["BkBufSize"]!=null)
BkBufSize
=Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["BkBufSize"]);

if(System.Configuration.ConfigurationManager.AppSettings["BkManager"]!=null)
BkManager
=System.Configuration.ConfigurationManager.AppSettings["BkManager"];

m_Execer
=newBkExecer();
//初始化回调
timerDelegate=newTimerCallback(m_Execer.DoBkExec);
//初始化定时器
stateTimer=newTimer(timerDelegate,null,5000,Interval);
}


/**//**//**////<summary>
///停止定时器.
///</summary>

staticvoidBkExecQuit()
{
stateTimer.Dispose();
}

}

2,后台处理执行



publicclassBkExecer
{
//维护一个前进前出的队列。
privateQueue<ExecItem>m_BkExecItemList;
privatestaticobjectlockHelper=newobject();
privatestaticboolm_IsBusy=false;

publicstaticboolIsBusy
{
get{returnm_IsBusy;}
}


publicBkExecer()
{
m_BkExecItemList
=newQueue<ExecItem>(BkExecManager.BkBufSize);
/**//**//**/////读入待处理事项
InitData();
}


privatevoidInitData()
{
lock(lockHelper)
{
string[]fnl=Directory.GetFiles(BkExecManager.DataPath);
foreach(stringsinfnl)
{
if(!s.Contains(BKExecItemState.出错.ToString()))
{
ExecItemei
=ExecItem.GetObject(s);
m_BkExecItemList.Enqueue(ei);
}

}

}

}


publicvoidAddBkExecItem(ExecItemei)
{
lock(lockHelper)
{
//锁定资源。
m_BkExecItemList.Enqueue(ei);
}

}


publicvoidDoBkExec(objectMsg)
{
ExecItemei;
while(m_BkExecItemList.Count>0)
{
lock(lockHelper)
{
ei
=m_BkExecItemList.Dequeue();
}


intrv=-1;
try
{
BindingFlagsflags
=BindingFlags.InvokeMethod|BindingFlags.Instance|
BindingFlags.Public
|BindingFlags.Static;
objectt=ei.ExecItemClass.InvokeMember(ei.ExecItemMethed,flags,
null,null,ei.ExecItemParamList);

if(t!=null)
rv
=Convert.ToInt32(t);
else
rv
=0;//如果是无返回则直接设置零.
}

catch(Exceptione)
{
//更新Ei的状态,保存到磁盘。
ei.FinishBkExec(false,e.Message);
}

finally
{
//更新Ei的状态,删除存件
//保存到磁盘。
if(rv>=0)
ei.FinishBkExec(
true,"");
else
ei.FinishBkExec(
false,rv.ToString());
}

}

}

}

3,任务对象


publicenumBKExecItemState{待执行,完成,出错};

[Serializable]
/**//**//**////<summary>
///后台命令集合
///直接将这些后台命令二进制序列化到WEb服务器上保存。
///如果完成后则从Web服务器上删除。
///如果异常则发邮件通知管理员。
///</summary>

publicclassExecItem
{
/**//**//**////<summary>
///磁盘文档名称 。
///</summary>

privatestringBKStoreFileName="";
privatestringErrMsg="";
privateBKExecItemStatem_ItemState;

publicBKExecItemStateItemState
{
get{returnm_ItemState;}
}


privateDateTimem_ExecItemExecTime;
publicDateTimeExecItemExecTime
{
get{returnm_ExecItemExecTime;}
}


privateDateTimem_ExecItemCreateTime;
publicDateTimeExecItemCreateTime
{
get{returnm_ExecItemCreateTime;}
}


privatestringm_ExecItemName;
publicstringExecItemName
{
get{returnm_ExecItemName;}
}


privateTypem_ExecItemClass;
publicTypeExecItemClass
{
get{returnm_ExecItemClass;}
}

privatestringm_ExecItemMethed;
publicstringExecItemMethed
{
get{returnm_ExecItemMethed;}
}


privateobject[]m_ExecItemParamList;
publicobject[]ExecItemParamList
{
get{returnm_ExecItemParamList;}
}


privatestringm_Op;
/**//**//**////<summary>
///后台任务对象
///</summary>
///<paramname="objtype">对象类型</param>
///<paramname="ExecMethod">调用方法</param>
///<paramname="param">调用参数</param>
///<paramname="ExecName">任务名</param>
///<paramname="Op">提交人</param>
///<paramname="SavetoDisk">是否保存到磁盘</param>

publicExecItem(Typeobjtype,stringExecMethod,object[]param,stringExecName,stringOp,boolSavetoDisk)
{
this.BKStoreFileName=String.Format("{0}{1}{2}.bin",
DateTime.Now.ToString(
"yyyy-MM-ddHH-mm-ss"),ExecMethod,Op);

this.m_ExecItemClass=objtype;
this.m_ExecItemCreateTime=DateTime.Now;
this.m_ExecItemExecTime=DateTime.Now;
this.m_ExecItemMethed=ExecMethod;
this.m_ExecItemName=ExecName;
this.m_ExecItemParamList=param;
this.m_ItemState=BKExecItemState.待执行;
this.m_Op=Op;

if(SavetoDisk)
SaveToDisk();
}


privatevoidSaveToDisk()
{
IFormatterformatter
=newBinaryFormatter();
Streamstream
=newFileStream(BkExecManager.DataPath+BKStoreFileName,
FileMode.Create,FileAccess.Write,FileShare.None);
formatter.Serialize(stream,
this);
stream.Close();
}


privatevoidSaveToDisk2()
{
//
stringbasedir=System.AppDomain.CurrentDomain.BaseDirectory;
this.BKStoreFileName=String.Format("{0}{1}{2}{3}.bin",
m_ExecItemCreateTime.ToString(
"yyyy-MM-ddHH-mm-ss"),
this.m_ExecItemMethed,
m_Op,
m_ItemState.ToString());

IFormatterformatter
=newBinaryFormatter();
Streamstream
=newFileStream(BkExecManager.DataPath+BKStoreFileName,
FileMode.Create,FileAccess.Write,FileShare.None);
formatter.Serialize(stream,
this);
stream.Close();
}


publicstaticExecItemGetObject(strings)
{
IFormatterformatter
=newBinaryFormatter();
Streamstream
=newFileStream(s,FileMode.Open,FileAccess.Read,FileShare.None);
ExecIteme
=(ExecItem)formatter.Deserialize(stream);
stream.Close();
returne;
}


publicvoidFinishBkExec(boolDoneOk,stringMsg)
{
stringFileName=BkExecManager.DataPath+BKStoreFileName;
m_ExecItemExecTime
=DateTime.Now;

if(File.Exists(FileName))
File.Delete(FileName);

if(!DoneOk)
{
m_ItemState
=BKExecItemState.出错;
ErrMsg
=Msg;
SaveToDisk2();
MakeMail();
}

}


privatevoidMakeMail()
{
StringBuildersb
=newStringBuilder();
sb.Append(
"提交人:").Append(this.m_Op).Append("<BR>");
sb.Append(
"提交时间:").Append(this.ExecItemCreateTime).Append("<BR>");
sb.Append(
"对象:").Append(this.m_ExecItemClass.Name).Append("<BR>");
sb.Append(
"方法:").Append(this.m_ExecItemMethed).Append("<BR>");
sb.Append(
"参数:");
foreach(objectointhis.m_ExecItemParamList)
sb.Append(o.ToString()).Append(
",");
sb.Append(
"<BR>");
sb.Append(
"执行时间:").Append(this.m_ExecItemExecTime).Append("<BR>");
sb.Append(
"错误信息:").Append(this.ErrMsg).Append("<BR>");
stringmb=sb.ToString();
//APP.Mail.Send(m_Op+":"+m_ExecItemClass.Name+"后台处理错",mb,"",BkExecManager.BkManager,"");
}

}

具体调用方法为

1,首先新调一个后台任务对象.
2,将之加入到任务队列中.

ExecItemei
=newExecItem(typeof(CacheManager),
"RefreshObject",
newobject[]{Objtype,Params,ct},
"缓存刷新",
"",
false);//注意以后可以设置为false,即刷新任务不保存到磁盘,以免影响磁盘性能.

BkExecManager.Execer.AddBkExecItem(ei);
分享到:
评论

相关推荐

    asp.net知识库

    采用XHTML和CSS设计可重用可换肤的WEB站点 asp.net的网址重定向方法的比较:面向搜索引擎友好 也谈 ASP.NET 1.1 中 QueryString 的安全获取写法 ASP.NET运行模式:PageHandlerFactory 利用搜索引擎引用来高亮页面...

    C#大作业-基于Asp.net Core 后台框架开发的内容管理系统源码+项目说明+sql数据库.zip

    基于Asp.net Core的后台快速开发框架,可用于快速开发 企业后台管理系统,WebApi接口,微信公众号和小程序后台,企业站,。 依赖环境 .net5.0, redis,mysql,SqlServer,PostgreSql ## 权限管理 用户管理 角色管理 ...

    淘特Asp Cms 6.5.rar

    6、增加一键升级至淘特Asp.Net工具,可无缝升级至淘特Asp.Net cms4.0版 7、其它CSS及JS优化,解决部分IE8下显示的问题。 默认管理地址:http://你的域名/admin/ 用户名:admins 密码:admins 提供的功能有...

    ExtAspNet v2.2.1 (2009-4-1) 值得一看

    -使得Asp.net的控件ImageButton具有和Asp.net的Button控件类似的行为(Ajax提交)(feedback:261629698)。 +TabStrip增加GetAddTabReference和GetRemoveTabReference两个函数,用来向TabStrip控件动态增加删除Tab。...

    ExtAspNet_v2.3.2_dll

    ExtAspNet - ExtJS based ASP.NET Controls with Full AJAX Support ExtAspNet是一组专业的Asp.net控件库,拥有原生的AJAX支持和丰富的UI效果, 目标是创建没有ViewState,没有JavaScript,没有CSS,没有...

    DreamerShop(梦想家)网上商店系统 v2.7Free版

    .NET是微软公司未来的核心战略,微软强烈推荐她的用户们使用ASP.NET构建的WEB系统,因为安全、可靠和高性能。 适用对象 本系统非常适合网络公司、电子商务实践者、创业者来运营。您只需要通过商店的后台管理系统,对...

    AMR采集系统(原万用小偷程序) v3.1

    AMR自动采集系统V3.1版要求:您的服务器必须支持asp.net 2.0, 必须使用MSSQL2000以上数据库版本. 附windows .net framework 2.0 32位下载地址:...

    搜索引擎代码

    而且所有功能全部基于web页面完成,您只需要购买一款支持asp.net的虚拟主机就能完成本程序的部署,网站轻松上线。 本程序具有毫秒级高速搜索, 搜索结果相关度排序 。多关键词搜索、超长词条搜索、关键词高亮显示。 ...

    vc++ 开发实例源码包

    详细演示了HtmlView的使用与HtmlView事件站点拦截的实现、js调用。 CIVStringSet_Demo 自定义了一个类似STL容器的类,并进行了测试。 ClearHistory 实现了 清楚internet临时文件、Cookie的清除、游览器地址栏历史...

    AMR采集系统(原万用小偷程序) v4.1

    AMR自动采集系统V4.1版要求:您的服务器必须支持asp.net 2.0, 必须使用MSSQL2005以上数据库版本. 附windows .net framework 2.0 32位下载地址:http://uwz.cc/10P 64位下载地址:http://uwz.cc/10Q 具体安装步骤参加...

Global site tag (gtag.js) - Google Analytics