C# Quartz 整理

因项目需要,在C#中使用了定时程序。自然就使用了Quartz了

但是使用的时候,经过一段时间后,发现了两个重大问题,结果导致的是一样的,就是都导致了定时不会继续执行了。

第一个问题是,定时程序发布在IIS下,但是IIS自己本身是有回收机制的,然后如果到了晚上,没人操作后台了,那么IIS会自动回收定时程序。

这里可以通过代码层面解决,就是说让IIS一直处于被使用状态,自然就不会回收了。

具体的代码改动是:

在项目中的Global.asax文件里,增加一段

protected void Application_End(object sender, EventArgs e)
        {
            // 在应用程序关闭时运行的代码   
            //解决应用池回收问题   
            System.Threading.Thread.Sleep(5000);
            string strUrl = ProjectPara.ProPath;
            System.Net.HttpWebRequest _HttpWebRequest = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(strUrl);
            System.Net.HttpWebResponse _HttpWebResponse = (System.Net.HttpWebResponse)_HttpWebRequest.GetResponse();
            System.IO.Stream _Stream = _HttpWebResponse.GetResponseStream();//得到回写的字节流   
        }

这个的方法触发的节点是应用程序关闭的时候会执行此方法,目的是通过HttpWebRequest发送一次请求,然后得到返回的字节流,这样每次应用程序关闭了,都会请求一次,就很好的阻止了IIS的回收。

还有一个问题是,定时程序执行中,如果程序中抛异常了,那么也会导致定时失效

首先需要的就是给这个定时的public string RunJob(ref JobDataMap dataMap, string jobName, string id, string taskName)方法,里边的内容增加try catch,到这里我以为就万事大吉了,但是令我没想到的是,定时还是会失效,经过一番思考,发现了问题,如果没出异常,这个方法应该返回一个字符串的,但是我竟然忽略了,如果走到catch里的话,就没有返回值了,所以修改方案就是在catch里增加一个返回值即可,里边的内容返回啥都行。

            catch (Exception ex)
            {
                Log.Write("RunJob", jobName + ex.Message, "异常");
                return "出现异常";
            }
            return "执行成功";

猜你喜欢

转载自www.cnblogs.com/Rexcnblog/p/9340607.html