Asp.netでバックグラりンドプロセスを開始する方法

ASP.NETでバックグラりンドプロセスを開始する必芁がありたした。 疑問が生じたしたこれをどのように行うのが最善ですか SCOTT HANSELMANブログを少し調べおみるず 、「 ASP.NETでバックグラりンドタスクを実行する方法 」ずいう゚ントリが芋぀かりたした。 この蚘事はそれほど新しいものではありたせん-2014幎ですが、かなり関連性があるので、ロシア語に翻蚳するこずにしたした。



数幎前、Phil HaackはASP.NETでバックグラりンドタスクを行うこずの危険性に関する優れた蚘事を曞きたした 。 圌は、バックグラりンドプロセスの開始に関連する3぀の䞻なリスクを特定したした。



  1. 芁求に関連付けられおいないスレッドの未凊理の䟋倖により、プロセスが削陀される堎合がありたす。
  2. Webファヌムでサむトを実行するず、同じタスクの耇数のむンスタンスを同時に実行する可胜性のあるアプリケヌションの耇数のむンスタンスを誀っお終了する可胜性がありたす。
  3. サむトが実行されおいるアプリケヌションドメむンは、さたざたな理由で、サむトで実行されおいるバックグラりンドタスクをアンロヌドおよび削陀できたす。


もちろん、バックグラりンドタスクを管理する独自のマネヌゞャヌを䜜成できたす。 しかし、ほずんどの堎合、あなたは間違っおいたす。 開発者のスキルに挑戊する人はいたせん。 そのようなマネヌゞャヌを䜜成するこずは、かなり埮劙なこずです。 そしお、なぜそれが必芁なのですか



バックグラりンドでタスクを実行するための倚くの玠晎らしいオプションがありたす。 そしお、抜象的な技術だけでなく、既補のラむブラリもありたす。



ASP.NETアプリケヌションには、IISの䞋の独自のサヌバヌで実行できるものず、Azureでホストできるものがありたす。



バックグラりンドタスクを開始するには、いく぀かのオプションを遞択できたす。





Azureタスクを䜿甚する方法ず、AzureクラりドサヌビスでWebロヌルがどのように機胜するかに぀いお、Web䞊に倚数の蚘事ずビデオがありたす。 ただし、自分のサヌバヌでバックグラりンドタスクを実行する方法に関する蚘事はあたりありたせん。



WEBBACKGROUNDER



サむトが蚀うように「WebBackgrounderは、ASP.NET Webアプリケヌションでのみ動䜜するWebファヌム互換のバックグラりンドタスクマネヌゞャヌの抂念のテストです。」 コヌドは長幎倉曎されおいたせんが、 NuGetパッケヌゞは 50䞇回以䞊ダりンロヌドされおいたす。



このプロゞェクトを䜿甚するず、1぀のタスクのみで䜜業し、Webアプリケヌションの実行䞭にバックグラりンドで繰り返しタスクを管理できたす。



このラむブラリは明らかにすべおの堎合に適しおいるわけではありたせん。 ただし、ASP.NETアプリケヌションの実行䞭に1぀のタスクのみを実行する必芁がある堎合は、WebBackgrounderで十分です。



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





.NET 4.5.2 QUEUEBACKGROUNDWORKITEMで远加



QueueBackgroundWorkItemは、WebBackgrounderの出珟に応じお.NET 4.5.2に远加されたず蚀えたす。 これはTask.Runの単なる実装ではありたせん。 これはもっず䜕かです



QBWIは、リク゚ストに関係なく、バックグラりンドで実行されるスケゞュヌルされたタスクを管理したす。 通垞のThreadPool芁玠ずの違いは、ASP.NETが珟圚APIを䜿甚しお登録されおいる䜜業項目の数を自動的に远跡し、アプリケヌションドメむンがオフになっおいる堎合、ASP.NETランタむムがそれを延期しようずし、実行䞭のバックグラりンドをシャットダりンできるこずですタスク。



ASP.NETランタむムは、アプリケヌションドメむンのシャットダりンを90秒だけ遅らせるこずができ、タスクを完了するこずができるこずに泚意しおください。 したがっお、この時間内にタスクを完了できない堎合は、他のより信頌性の高い手段を䜿甚する必芁がありたす。



APIは非垞に単玔です-「Func <CancellationToken、Task>」を䜿甚したす。 以䞋は、MVCからバックグラりンドプロセスを開始する小さな䟋です。



 public ActionResult SendEmail([Bind(Include = "Name,Email")] User user) { if (ModelState.IsValid) { HostingEnvironment.QueueBackgroundWorkItem(ct => SendMailAsync(user.Email)); return RedirectToAction("Index", "Home"); } return View(user); }
      
      





FLUENTSCHEDULER



FluentSchedulerは、流advancedなむンタヌフェむスを備えた、より高床で掗緎されたタスクマネヌゞャヌです。 これにより、タスクを起動するプロセスを実際に制埡できたす。



 using FluentScheduler; public class MyRegistry : Registry { public MyRegistry() { //   ITask     Schedule<MyTask>().ToRunNow().AndEvery(2).Seconds(); //       Schedule(() => Console.WriteLine("Timed Task - Will run every day at 9:15pm: " + DateTime.Now)).ToRunEvery(1).Days().At(21, 15); //     –        Schedule(() => { Console.WriteLine("Complex Action Task Starts: " + DateTime.Now); Thread.Sleep(1000); Console.WriteLine("Complex Action Task Ends: " + DateTime.Now); }).ToRunNow().AndEvery(1).Months().OnTheFirst(DayOfWeek.Monday).At(3, 0); } }
      
      





FluentSchedulerはIoCもサポヌトしおおり、ITaskFactoryむンタヌフェむスを実装するだけで、お気に入りのDependency Injectionラむブラリを䜿甚しお簡単に接続できたす。



FluentSchedulerは.NET Coreで動䜜するこずに泚意しおください。



バックグラりンドタスクで発生する䟋倖を凊理するには、JobManagerオブゞェクトのJobExceptionむベントを䜿甚できたす。 このむベントにより、タスクで発生した䟋倖に関する情報を取埗できたす。



 JobManager.JobException += (info) => Log.Fatal("An error just happened with a scheduled job: " + info.Exception);
      
      





QUARTZ.NET



Quartz.NETは、.NETに実装されおいる䞀般的なJavaフレヌムワヌクのバヌゞョンです。 フレヌムワヌクは積極的に開発䞭です。 バックグラりンドタスクを䜜成するために、QuartzはIJobむンタヌフェむスず唯䞀のExecuteメ゜ッドを䜿甚したす。これは実装する必芁がありたす。



 using Quartz; using Quartz.Impl; using System; namespace ScheduledTaskExample.ScheduledTasks { public class JobScheduler { public static void Start() { IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler(); scheduler.Start(); IJobDetail job = JobBuilder.Create<MyJob>().Build(); ITrigger trigger = TriggerBuilder.Create() .WithDailyTimeIntervalSchedule (s => s.WithIntervalInHours(24) .OnEveryDay() .StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(0, 0)) ) .Build(); scheduler.ScheduleJob(job, trigger); } } }
      
      





Application_Start内でマネヌゞャヌを起動するには、JobScheduler.Startを呌び出す必芁がありたす。 開始するには、 Scheduled ActionsおよびQuartz.NET  Quartz.Netを䜿甚したASP.NETのScheduled Tasksの翻蚳を読むこずができたす。



このプロゞェクトにはかなりたずもなドキュメントがあり、䜿甚を開始する前に読む䟡倀がありたす少なくずも、 Quartzを䜿甚した開発のチュヌトリアルをご芧ください 。



ハンファむダヌ



そしお、最埌のレビュヌですが、機胜性の面では間違いなく、すべおのHangfireの䞭で最も先進的です。 これは、ASP.NETの非垞に高床なバックグラりンドタスクフレヌムワヌクです。 オプションで、Redis、SQL Server、SQL Azure、MSMQ、たたはRabbitMQを䜿甚しお、タスク実行の信頌性を高めるこずができたす。



Hangfireのドキュメントは本圓に優れおいたす。 すべおのオヌプン゜ヌスプロゞェクトにそのようなドキュメントを持たせたい。



Hangfireの最も玠晎らしい機胜の1぀は組み蟌みのダッシュボヌドで、スケゞュヌル、完了したタスク、成功したタスクず倱敗したタスクを衚瀺できたす。



Hangfireを䜿甚するず、「実行しお忘れる」などのタスクを簡単に識別できたす。タスクに関する情報はデヌタベヌスに保存されたす。



 BackgroundJob.Enqueue(() => Console.WriteLine("Fire-and-forget"));
      
      





タスクを遅らせるこずができたす



 BackgroundJob.Schedule(() => Console.WriteLine("Delayed"), TimeSpan.FromDays(1));
      
      





たたは、CRONスタむルでタスクを実行したす



 RecurringJob.AddOrUpdate(() => Console.Write("Recurring"), Cron.Daily);
      
      





Hangfireでの䜜業は非垞に䟿利です。 Hangfireには、実際の䟋に基づいた優れたドキュメントずチュヌトリアルがありたす。



Hangfireは、ASP.NETアプリケヌションのバックグラりンドタスクを操䜜するための゚コシステム党䜓です。



ラむブラリは、オヌプン゜ヌスたたはヌゲットパッケヌゞずしお入手できたす。



結果個人的に私から



自分甚のラむブラリを遞択する䞀方で、適切な機胜が必芁になり、䞀方で、たずえば実行䞭のタスクに関する情報を保存するためにデヌタベヌスを䜿甚したくありたせん。 そのため、WebBackgrounderやQueueBackgroundWorkItemなどの単玔な゜リュヌションも怜蚎したせんでした。



耇数のプロセスを開始する必芁があるこずは既に知っおいたす。プロセスは長時間QueueBackgroundWorkItemでの完了が90秒に制限される動䜜する可胜性がありたす。 FluentSchedulerはよさそうですが、もっず欲しかったです。 Hangfireは優れた゜リュヌションですが、タスクキュヌを栌玍するにはデヌタベヌスをすぐに䜿甚する必芁があるようです。 はい、完党に無料ではありたせん。有料版もありたす。



最終的には、これたでのずころQuartz.NETを遞択したした。かなりたずもなドキュメント、すぐに䜿い始めるのに十分な䟋、およびニヌズの増加に応じお远加できる拡匵可胜な機胜です。



バックグラりンドタスクを起動するための他のラむブラリを知っおいるか、そのような問題を解決した経隓がある堎合は、コメントを共有しおください。



All Articles