2014-09-19 7 views
8

मैं पृष्ठभूमि में एक काम तो क्या मेरी कार्य कर रहा है लागू करने की आवश्यकता के लिए पृष्ठभूमि कार्य चलाने के लिए? मैं एक मेज है कि प्रत्येक ग्राहकों की किराया राशि को संग्रहीत करता है, तो मैं ackf इसलिए मैं इसे googled और मैं कोड का एक टुकड़ा है कि (यह webbackgrounder बुलाया nuget है) में पाया गया एक विशिष्ट datetime के बाद हर महीने में किराए मूल्य की गणना करने की जरूरत है मैं जोड़ा यह मेरे समाधान के लिए और यह मेरे कोड के इस हिस्से मेरी कार्य संभाल करने देता है:MVC में webbackgrounder nuget का उपयोग लंबे समय

using System; 
using System.Threading; 
using System.Threading.Tasks; 

    namespace WebBackgrounder.DemoWeb 
    { 
     public class SampleJob : Job 
     { 
      public SampleJob(TimeSpan interval, TimeSpan timeout) 
       : base("Sample Job", interval, timeout) 
      { 
      } 

      public override Task Execute() 
      { 
       return new Task(() => Thread.Sleep(3000)); 
      } 
     } 
    } 

मुझे पता है कि कैसे मैं अपने काम के लिए कार्यक्रम कर सकते हैं करना चाहते हैं?

अधिक विवरण: Here

मैं this article पाया, लेकिन तथ्य यह है मैं नहीं जानता कि मैं लंबे समय के लिए इस विधि का उपयोग कर सकते हैं ?? सबसे अच्छा संबंध है।

किसी भी विचार की सराहना की जाएगी।

उत्तर

15

तुम भी है कि नौकरी शुरू करने और यह जीवन है का प्रबंधन करेगा आपके आवेदन की App_Start फ़ोल्डर में एक कक्षा में जोड़ने की जरूरत है। आप एक उदाहरण देख सकते हैं ... https://github.com/NuGet/WebBackgrounder/tree/master/src/WebBackgrounder.DemoWeb

यहाँ डेमो एप्लिकेशन

using System; 
using Elmah; 
using WebBackgrounder.Jobs; 

[assembly: WebActivator.PostApplicationStartMethod(typeof(WebBackgrounder.DemoWeb.App_Start.WebBackgrounderSetup), "Start")] 
[assembly: WebActivator.ApplicationShutdownMethod(typeof(WebBackgrounder.DemoWeb.App_Start.WebBackgrounderSetup), "Shutdown")] 

namespace WebBackgrounder.DemoWeb.App_Start 
{ 
    public static class WebBackgrounderSetup 
    { 
     static readonly JobManager _jobManager = CreateJobWorkersManager(); 

     public static void Start() 
     { 
      _jobManager.Start(); 
     } 

     public static void Shutdown() 
     { 
      _jobManager.Dispose(); 
     } 

     private static JobManager CreateJobWorkersManager() 
     { 
      var jobs = new IJob[] 
      { 
       new SampleJob(TimeSpan.FromSeconds(5), TimeSpan.FromSeconds(20)), 
       /* new ExceptionJob(TimeSpan.FromSeconds(15)), */ 
       new WorkItemCleanupJob(TimeSpan.FromMinutes(1), TimeSpan.FromMinutes(5), new WorkItemsContext()) 
      }; 

      var coordinator = new WebFarmJobCoordinator(new EntityWorkItemRepository(() => new WorkItemsContext())); 
      var manager = new JobManager(jobs, coordinator); 
      manager.Fail(ex => Elmah.ErrorLog.GetDefault(null).Log(new Error(ex))); 
      return manager; 
     } 
    } 
} 

से कोड हालांकि मैंने पाया यह सरल अभी Webbackgrounder के कुछ हिस्सों कि मैं इस प्रकार की जरूरत का प्रयोग है। App_Start फ़ोल्डर

using System; 
using BombaySapphireCds.Jobs; 
using Elmah; 

[assembly: WebActivator.PostApplicationStartMethod(typeof(BombaySapphireCds.App_Start.PodMonitorConfig), "Start")] 
[assembly: WebActivator.ApplicationShutdownMethod(typeof(BombaySapphireCds.App_Start.PodMonitorConfig), "Shutdown")] 

namespace BombaySapphireCds.App_Start 
{ 
    public static class PodMonitorConfig 
    { 
     private static PodMonitorJob m_job; 

     public static void Start() 
     { 
      m_job = new PodMonitorJob(TimeSpan.FromSeconds(20)); 
     } 

     public static void Shutdown() 
     { 
      m_job.Dispose(); 
     } 
    } 
} 

और वर्ग वास्तविक कार्य करने के लिए इस वर्ग रखें ...

using System; 
using System.Threading; 
using System.Threading.Tasks; 

namespace BombaySapphireCds.Jobs 
{ 
    public class PodMonitorJob : IDisposable 
    { 
     private CancellationTokenSource m_cancel; 
     private Task m_task; 
     private TimeSpan m_interval; 
     private bool m_running; 

     public PodMonitorJob(TimeSpan interval) 
     { 
      m_interval = interval; 
      m_running = true; 
      m_cancel = new CancellationTokenSource(); 
      m_task = Task.Run(() => TaskLoop(), m_cancel.Token); 
     } 

     private void TaskLoop() 
     { 
      while (m_running) 
      { 
       // 
       // Do monitoring work here. 
       // 

       Thread.Sleep(m_interval); 
      } 
     } 

     public void Dispose() 
     { 
      m_running = false; 

      if (m_cancel != null) 
      { 
       try 
       { 
        m_cancel.Cancel(); 
        m_cancel.Dispose(); 
       } 
       catch 
       { 
       } 
       finally 
       { 
        m_cancel = null; 
       } 
      } 
     } 
    } 
} 
3

इस पर पृष्ठभूमि कार्य निष्पादन के लिए नए मानक बन गया है (आप की तरह इस कहीं भी रख) मकड़जाल। यह एक NuGet पैकेज है और इसे हैंगफायर कहा जाता है - https://github.com/HangfireIO/Hangfire। कार्य ऐपपूल रीसाइक्लिंग से परे भी बने रहते हैं।

+2

.net 4.5 की आवश्यकता है। – kristianp

संबंधित मुद्दे