2016-03-29 11 views
-1

Ich entwickle ASP.NET5 Application und ich möchte ein Ereignis auf dem Server nach einer bestimmten Verzögerung auslösen. Ich möchte auch, dass der Client eine Anfrage an den Server senden kann, um die Ausführung des Ereignisses abzubrechen. Wie kann ich eine Timer beibehalten, damit ich sie in einer anderen Anfrage durch den Aufruf Change(Timeout.Infinite, Timeout.Infinite) abbrechen kann?ein Ereignis auf dem Server nach bestimmter Verzögerung auslösen

public class ApiController : Controller 
{ 
    public IActionResult SetTimer() 
    { 
     TimerCallback callback = new TimerCallback(EventToRaise); 
     Timer t = new Timer(callback, null, 10000, Timeout.Infinite); 
     //I need to persist Timer instance somehow in order to cancel the event later 
     return HttpOkObjectResult(timerId); 
    } 

    public IActionResult CancelTimer(int timerId) 
    { 
     /* 
     here I want to get the timer instance 
     and call Change(Timeout.Infinite, Timeout.Infinite) 
     in order to cancel the event 
     */ 
     return HttpOkResult(); 
    } 

    private void EventToRaise(object obj) 
    { 
     ///.. 
    } 
} 

ich System.Threading.Timer bin mit der Ausführung des EventToRaise zu verzögern, mein Ansatz richtig ist oder sollte ich es auf eine andere Weise zu tun? Was ist der beste Weg, um es zu erreichen?

+1

Read this => http://www.hanselman.com/blog/HowToRunBackgroundTasksInASPNET.aspx – CodeNotFound

+0

hilft @CodeNotFound Danke, Sir, ich denke, ich werde Hangfire verwenden, wie in dem Artikel empfohlen. – koryakinp

Antwort

0

Sie können Quartz.NET wie unten gezeigt verwenden. Auf der anderen Seite, für IIS-basierte Trigger-Probleme, werfen Sie einen Blick auf meine Antwort auf Quartz.net scheduler doesn't fire jobs/triggers once deployed.

Global.asax:

protected void Application_Start() 
{ 
    JobScheduler.Start(); 
} 


EmailJob.cs:

using Quartz; 

public class EmailJob : IJob 
{ 
    public void Execute(IJobExecutionContext context) 
    { 
     SendEmail(); 
    } 
} 


JobScheduler.cs:

using Quartz; 
using Quartz.Impl; 

public class JobScheduler 
{ 
    public static void Start() 
    { 
     IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler(); 
     scheduler.Start(); 

     IJobDetail job = JobBuilder.Create<EmailJob>().Build(); 
     ITrigger trigger = TriggerBuilder.Create() 
      .WithIdentity("trigger1", "group1") 
      //.StartAt(new DateTime(2015, 12, 21, 17, 19, 0, 0)) 
      .StartNow() 
      .WithSchedule(CronScheduleBuilder 
       .WeeklyOnDayAndHourAndMinute(DayOfWeek.Monday, 10, 00) 
       //.WithMisfireHandlingInstructionDoNothing() //Do not fire if the firing is missed 
       .WithMisfireHandlingInstructionFireAndProceed() //MISFIRE_INSTRUCTION_FIRE_NOW 
       .InTimeZone(TimeZoneInfo.FindSystemTimeZoneById("GTB Standard Time")) //(GMT+02:00) 
       ) 
      .Build(); 
     scheduler.ScheduleJob(job, trigger); 
    } 
} 

Hope this ...

Verwandte Themen