Execute a planned task in a web application (multi-thread)

xiaoxiao2021-03-06  80

In business complex applications, sometimes one or more tasks can be planned within a certain amount of time or a certain time interval, such as timing backup or synchronous database, timing sends email, etc., we call it planned task. There are also many ways to implement planned tasks, and you can implement the SQLAgent to implement the stored procedure, or you can use the Windows task scheduler to implement, you can also use the Windows service to complete our planned task, which is a good solution. However, for web applications, these methods are not very simple, host service providers or unable to provide such services, or you need you to pay many additional fees. This article describes a simple way to use directly in a web application, which does not require any additional configurations.

Since the ASP.NET site is run as a web application, it is not limited by the thread, so we can easily create and destroy a planned task in Application_Start and Application_end events. Let's take a brief introduction to the method of implementing planning tasks in the Web site. Our example is to add information to the file timing, as an example, where the current time is written to the file.

The work unit of a planned task is called a task (JOB). The following code describes a universal interface that can be performed by the scheduled engine plan for all tasks. Each task here implements the Execute method for the transfer engine. transfer:

Public interface ischedulerJob {void execute ();

As mentioned earlier, our example is to implement the document, such as the character date, which is the method of implementing this task:

Public class sample, {// file saved physical path, cstest is a virtual directory name, f: / inetpub / wwwroot / cstest is a physical path string p = @ "f: / inetpub / wwwroot / cstest "; // We create the SchedulerJob folder in the root of the virtual directory, and set the permissions to modify, //schedulerJob.txt is the file we have written String file_name = p " //schedulerjob/schedulerjob.txt " ; // get the current server time, and convert to string string c = system.datetime.now.tostring ("YYYY-MM-DD HH: MM: SS"); / / Tag is the sputum of the new file BOOL FLAG = False; // If the file does not exist, create the file if (! file.exists (file_name)) {flag = true; streamwriter sr = file.createtext (file_name); sr.close ();} // Write files Intent StreamWriter X = New StreamWriter (file_name, true, system.text.encoding.default); if (flag) x.write ("Scheduled task test start:"); x.write ("/ r / n" C ); X.Close ();}}

Next, we build a configuration object, tell the scheduled engine to perform what tasks and time intervals are performed. Public class schedulerConfiguration {// Time Interval Private Int Sleepinterval; // Task List Private ArrayList Jobs = New ArrayList ();

Public Int Sleepinterval {Get {Return Sleepinterval;}} public arraylist jobs {get {return jobs;}}

// Scheduling Configuration Class Constructor PUBLIC SCHEDULERCONFIGURATION (INT Newsleepinterval) {Sleepinterval = Newsleepinterval;}}

Below is the schedule engine, and the task of the configuration object is performed.

Public class scheduler {private schedulerconfiguration control;

Public Scheduler (SchedulerConfiguration Config) {Configuration = Config;

public void Start () {while (true) {// perform each task foreach (ISchedulerJob job in configuration.Jobs) {ThreadStart myThreadDelegate = new ThreadStart (job.Execute); Thread myThread = new Thread (myThreadDelegate); myThread.Start (); Thread.sleep (configuration.sleepinterval);}}}}

All preparations have been completed, the following is the work of the activation engine. In order to make our task plan, we create and destroy jobs in Applicatio_Start and Application_end in the global.asax.cs file, first create a thread running running, we have a running interval here for 3 seconds.

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 ();}

Finally, you need to destroy when you quit:

Protected Void Application_end (Object Sender, Eventargs E) {if (null! = schedulerthread) {schedulerthread.abort ();}} Well, build a C # web application engineering in vs.NET, establish taskscheduler.cs class, And modify the corresponding global.asax.cs file. In order to see the effect, we build a form Webform1.aspx, and the timing refreshes to check the data we recorded:

<% @ Page language = "c #" codebehind = "Webform1.aspx.cs" autoeventwireup = "false" inherits = "cstest.webform1"%> Example of implementing planning tasks in a web application </ title> <meta http-equiv =" refresh "content =" 10 "> <meta name =" generator "content = "Microsoft Visual Studio 7.0"> <meta name = "CODE_LANGUAGE" Content = "C #"> <meta name = "vs_defaultClientScript" content = "javascript"> <meta name = "vs_targetSchema" content = "http://schemas.microsoft .com / intellisense / ie5 ";> </ 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></p> <p>Compiling and running the project, you can see the result, the result is as follows:</p> <p>Plan mission test start: 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</p></div><div class="text-center mt-3 text-grey"> 转载请注明原文地址:https://www.9cbs.com/read-107828.html</div><div class="plugin d-flex justify-content-center mt-3"></div><hr><div class="row"><div class="col-lg-12 text-muted mt-2"><i class="icon-tags mr-2"></i><span class="badge border border-secondary mr-2"><h2 class="h6 mb-0 small"><a class="text-secondary" href="tag-2.html">9cbs</a></h2></span></div></div></div></div><div class="card card-postlist border-white shadow"><div class="card-body"><div class="card-title"><div class="d-flex justify-content-between"><div><b>New Post</b>(<span class="posts">0</span>) </div><div></div></div></div><ul class="postlist list-unstyled"> </ul></div></div><div class="d-none threadlist"><input type="checkbox" name="modtid" value="107828" checked /></div></div></div></div></div><footer class="text-muted small bg-dark py-4 mt-3" id="footer"><div class="container"><div class="row"><div class="col">CopyRight © 2020 All Rights Reserved </div><div class="col text-right">Processed: <b>0.042</b>, SQL: <b>9</b></div></div></div></footer><script src="./lang/en-us/lang.js?2.2.0"></script><script src="view/js/jquery.min.js?2.2.0"></script><script src="view/js/popper.min.js?2.2.0"></script><script src="view/js/bootstrap.min.js?2.2.0"></script><script src="view/js/xiuno.js?2.2.0"></script><script src="view/js/bootstrap-plugin.js?2.2.0"></script><script src="view/js/async.min.js?2.2.0"></script><script src="view/js/form.js?2.2.0"></script><script> var debug = DEBUG = 0; var url_rewrite_on = 1; var url_path = './'; var forumarr = {"1":"Tech"}; var fid = 1; var uid = 0; var gid = 0; xn.options.water_image_url = 'view/img/water-small.png'; </script><script src="view/js/wellcms.js?2.2.0"></script><a class="scroll-to-top rounded" href="javascript:void(0);"><i class="icon-angle-up"></i></a><a class="scroll-to-bottom rounded" href="javascript:void(0);" style="display: inline;"><i class="icon-angle-down"></i></a></body></html><script> var forum_url = 'list-1.html'; var safe_token = 'MLxSGnZ34xWuWfeP41qFHT6bPLRz12lPHYC64CmMWa_2Bw4FpnV_2BTUIiWYqbkToFGq67ZfRWv3_2FcQSqhqOv11xRQ_3D_3D'; var body = $('body'); body.on('submit', '#form', function() { var jthis = $(this); var jsubmit = jthis.find('#submit'); jthis.reset(); jsubmit.button('loading'); var postdata = jthis.serializeObject(); $.xpost(jthis.attr('action'), postdata, function(code, message) { if(code == 0) { location.reload(); } else { $.alert(message); jsubmit.button('reset'); } }); return false; }); function resize_image() { var jmessagelist = $('div.message'); var first_width = jmessagelist.width(); jmessagelist.each(function() { var jdiv = $(this); var maxwidth = jdiv.attr('isfirst') ? first_width : jdiv.width(); var jmessage_width = Math.min(jdiv.width(), maxwidth); jdiv.find('img, embed, iframe, video').each(function() { var jimg = $(this); var img_width = this.org_width; var img_height = this.org_height; if(!img_width) { var img_width = jimg.attr('width'); var img_height = jimg.attr('height'); this.org_width = img_width; this.org_height = img_height; } if(img_width > jmessage_width) { if(this.tagName == 'IMG') { jimg.width(jmessage_width); jimg.css('height', 'auto'); jimg.css('cursor', 'pointer'); jimg.on('click', function() { }); } else { jimg.width(jmessage_width); var height = (img_height / img_width) * jimg.width(); jimg.height(height); } } }); }); } function resize_table() { $('div.message').each(function() { var jdiv = $(this); jdiv.find('table').addClass('table').wrap('<div class="table-responsive"></div>'); }); } $(function() { resize_image(); resize_table(); $(window).on('resize', resize_image); }); var jmessage = $('#message'); jmessage.on('focus', function() {if(jmessage.t) { clearTimeout(jmessage.t); jmessage.t = null; } jmessage.css('height', '6rem'); }); jmessage.on('blur', function() {jmessage.t = setTimeout(function() { jmessage.css('height', '2.5rem');}, 1000); }); $('#nav li[data-active="fid-1"]').addClass('active'); </script>