用户操作
[即时聊天] [发私信] [加为好友]
孟宪会ID:net_lover
938193次访问,排名33好友200人,关注者1660
http://dotnet.aspx.cc/
【声明:各位好,由于系统“添加好友”功能只能添加200个,后来的朋友不能加入,见谅!!!】
net_lover的文章
原创 251 篇
翻译 3 篇
转载 5 篇
评论 866 篇
孟宪会的公告
欢迎光临!您在阅读的过程中有任何建议或者意见,请发邮件或者留言,合作愉快!
最近评论
prettyfcm:谢谢
net_lover:你好。首先感谢您阅读本书。
你可以从下面几个方面进行调试下:
1,你的存储过程是4个参数,而你只传进去3个?检查一下参数传递是否正确。
2,执行 SqlHelper.ExecuteNonQuery 之前打印出 各个变量值是否已经错乱?判断是数据收集出的问题还是 SqlHelper 的问题。
3,IIS6需要注意:由于asp.net可以运行多个进程,应用……
hcqzw2:而正确的收费表的数据应为:
yhh ysje ssje operation
11 10 10 张三
33 30 30 李四
就是说 张三传到服务器的数据 ssje.Text 10 Session["username"]="张三" 被李四写入数据库
李四 传到服务……
hcqzw2:孟宪会老师、张慧妍老师好!

我买了您的书《ASP.NET2.0应用开发技术》,书非常好,但我遇到如下问题,请求指教:
语言:asp.net 2.0c#,数据库:sql server 2000, 收费程序:
读者 asp.net session数据更新混乱
登录页面代码:
Session["username"] = ……
oyiboy:老外用的方法是window.open,优点是可以利用js随意调节新窗的样式和尺寸,不过,国内的广告防弹插件几乎把这个方式给扼杀掉了,所以相对而言比较倾向于form,其实用超链接A也是可以,只是A.Click()方法象是在FF下不支持,所以只好用Form的get基本上可以简化成

public void ResponseRedirect(string url)
文章分类
收藏
    相册
    文章用图
    【孟子E章】站点
    【孟子E章】站点(RSS)
    【孟子E章】网摘(RSS)
    【孟子E章】网站(RSS)
    Silverlight 1.0 SDK 中文版
    Silverlight 1.0 SDK 中文版
    【网上邻居】
    .Net开发资源中心
    【兔子】专栏
    AppleVB 主页
    Estyle(靳田)之狂想手扎
    huahaoyueyuan
    JavaProgramers的专栏
    意玺的BLOG
    最爱白菜
    枕善居VB.NET源码博客
    美丽眼睛看世界
    阿赖
    存档
    订阅我的博客
    XML聚合  FeedSky

    原创 在Web应用程序中执行计划任务(多线程)收藏

    新一篇: 在.NET应用程序中添加拼写和语法检查功能 | 旧一篇: 动态创建SQL Server数据库、表、存储过程等架构信息

    在Web应用程序中执行计划任务(多线程) 

     

     
    在业务复杂的应用程序中,有时候会要求一个或者多个任务在一定的时间或者一定的时间间隔内计划进行,比如定时备份或同步数据库,定时发送电子邮件等,我们称之为计划任务。实现计划任务的方法也有很多,可以采用SQLAgent执行存储过程来实现,也可以采用Windows任务调度程序来实现,也可以使用Windows服务来完成我们的计划任务,这些方法都是很好的解决方案。但是,对于Web应用程序来说,这些方法实现起来并不是很简单的,主机服务提供商或者不能直接提供这样的服务,或者需要你支付许多额外的费用。 本文就介绍一个直接在Web应用程序中使用的简单的方法,这个方法不需要任何额外的配置即可轻松实现。

    由于ASP.NET站点是作为Web应用程序运行的,它并不受线程的限制,因此我们可以非常方便地在Application_Start和Application_End事件中建立和销毁一个计划任务。下面就简单介绍一下在Web站点实现计划任务的方法。我们的例子是定时往文件里添加信息,作为例子,这里把当前的时间定时地写入文件中。

    一个计划任务的工作单元称之为一个任务(Job),下面的代码描述了对所有任务都可以被调度引擎计划执行的一个通用的接口,这里的每个任务实现了Execute方法,供调度引擎进行调用:

         public interface ISchedulerJob
         {
          void Execute();
         }
    如前所述,我们的例子是实现往文件写如字符日期,下面就是实现这一任务的方法:

         public class SampleJob : ISchedulerJob
         {
          public void Execute()
          {
           //文件保存的物理路径,CSTest为虚拟目录名称,F:InetpubwwwrootCSTest为物理路径
           string p = @"F:InetpubwwwrootCSTest";
           //我们在虚拟目录的根目录下建立SchedulerJob文件夹,并设置权限为匿名可修改,
           //SchedulerJob.txt就是我们所写的文件
           string FILE_NAME = p+ "\SchedulerJob\SchedulerJob.txt";
           //取得当前服务器时间,并转换成字符串
           string c = System.DateTime.Now.ToString("yyyy-mm-dd hh:MM:ss");
           //标记是否是新建文件的标量
           bool flag = false;
           //如果文件不存在,就新建该文件
           if (!File.Exists(FILE_NAME))
           {
            flag = true;
            StreamWriter sr = File.CreateText(FILE_NAME);
            sr.Close();
           }
           //向文件写入内容
           StreamWriter x = new StreamWriter(FILE_NAME,true,System.Text.Encoding.Default);
           if(flag) x.Write("计划任务测试开始:");
           x.Write(" "+c);
           x.Close();
          }
         }
    接下来,我们建立一个配置对象,告诉调度引擎执行什么任务和执行的时间间隔。

         public class SchedulerConfiguration
         {
          //时间间隔
          private int sleepInterval;
          //任务列表
          private ArrayList jobs = new ArrayList();

          public int SleepInterval { get { return sleepInterval; } }
          public ArrayList Jobs { get { return jobs; } }

          //调度配置类的构造函数
          public SchedulerConfiguration(int newSleepInterval)
          {
           sleepInterval = newSleepInterval;
          }
         }
    下面就是调度引擎,定时执行配置对象的任务

         public class Scheduler
         {
          private SchedulerConfiguration configuration = null;

          public Scheduler(SchedulerConfiguration config)
          {
           configuration = config;
          }

          public void Start()
          {
           while(true)
           {
            //执行每一个任务
            foreach(ISchedulerJob job in configuration.Jobs)
            {
             ThreadStart myThreadDelegate = new ThreadStart(job.Execute);
             Thread myThread = new Thread(myThreadDelegate);
             myThread.Start();
             Thread.Sleep(configuration.SleepInterval);
            }
           }
          }
         }
    所有的准备工作已经完成,下面就是激活引擎的工作了。为了让我们的任务计划执行,我们在Global.asax.cs文件里的Applicatio_Start和Application_End里进行建立和销毁工作,首先建立一个调度进程运行的线程,我们这里的运行间隔时间为3秒钟。

      public System.Threading.Thread schedulerThread = null;
      protected void Application_Start(Object sender, EventArgs e)
      {
        SchedulerConfiguration config =  new SchedulerConfiguration(1000*3);
        config.Jobs.Add(new SampleJob());
        Scheduler scheduler = new Scheduler(config);
        System.Threading.ThreadStart myThreadStart =  new System.Threading.ThreadStart(scheduler.Start);
        System.Threading.Thread schedulerThread = new System.Threading.Thread(myThreadStart);
        schedulerThread.Start();
      }
    最后还需要在程序退出时进行销毁:

      protected void Application_End(Object sender, EventArgs e)
      {
        if (null != schedulerThread)
        {
          schedulerThread.Abort();
        }
      }
    好了,在VS.NET里建立一个C#的Web应用程序工程,建立TaskScheduler.cs类,并修改相应的Global.asax.cs文件。为了能看到效果,我们再建立一个表单WebForm1.aspx,定时刷新来检查我们所记录的数据:

        
    <%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false"
         Inherits
    ="CSTest.WebForm1" 
    %>
        
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
        
    <HTML>
          
    <HEAD>
            
    <title>在Web应用程序中执行计划任务的例子</title>
            
    <meta http-equiv="refresh" content="10">
          
    </HEAD>
          
    <body MS_POSITIONING="GridLayout">
            
    <form id="Form1" method="post" runat="server">
              
    <iframe style="width:100%;height:100%" src="SchedulerJob/SchedulerJob.txt"></iframe>
            
    </form>
          
    </body>
        
    </HTML>
    对工程进行编译并运行,就可以看到结果了,结果如下:

            计划任务测试开始:
            2003-13-10 11:08:15
            2003-13-10 11:08:18
            2003-13-10 11:08:21
            2003-13-10 11:08:24
            2003-13-10 11:08:27
            2003-13-10 11:08:30
    需要说明的是,以上只是在Web应用程序中执行计划任务的简单例子,对于多个任务来说,需要在不同的线程内进行工作,对计划的安排也是很简单的,实际还需要站点堵塞,当机的情况。另外这里也没有进行错误的处理等工作,相信大家会写出更加完美的代码的。
     

    发表于 @ 2003年08月27日 21:46:00|评论(loading...)|编辑

    新一篇: 在.NET应用程序中添加拼写和语法检查功能 | 旧一篇: 动态创建SQL Server数据库、表、存储过程等架构信息

    评论

    #df 发表于2005-03-02 14:04:00  IP: 60.180.229.*
    我照着你上面的做了一遍,没有效果呀,不知可不可以把源码发给我的呀,

    userhjw@163.com
    不胜感激
    #CNDSN 发表于2006-03-22 16:46:00  IP: 58.63.185.*
    弄了很久效果就是不出来,能给一份我吗,感激!!
    lxl2025@21cn.com
    #井辰 发表于2006-07-20 17:05:00  IP: 61.140.102.*
    有一点不明:Scheduler.Start()里的循环为什么是死循环?
    #何必…… 发表于2006-07-28 09:37:00  IP: 218.94.87.*
    没搞出来,能发一份源码研究学习一下吗?mk12l@163.com
    谢谢。
    #【孟子E章】 发表于2006-10-25 17:43:00  IP: 219.237.16.*
    下载代码
    http://dotnet.aspx.cc/Web/WebApplication1.zip
    #wangyouworld 发表于2007-08-09 09:48:33  IP: 221.13.134.*
    顶下啊!
    有没VB的?
    俺BEN。
    #LikeCode 发表于2007-10-31 11:52:10  IP: 116.26.225.*
    谢谢孟子, 可是代码 http://dotnet.aspx.cc/Web/WebApplication1.zip 下载不了, 你能核查一下吗, 谢谢!
    #LikeCode 发表于2007-11-15 20:22:50  IP: 116.26.230.*
    谢谢孟子, 今天再试一下, 成功下载! 谢谢!
    #lczddd 发表于2008-07-23 08:59:08  IP: 123.165.17.*
    牛人就是牛人,不是一般的牛,是巨牛,呵呵
    #lfywy 发表于2008-07-23 15:50:30  IP: 210.22.155.*
    确实不错,经测试,很不错!感谢孟子分享!
    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © 孟宪会