در توسینسو تدریس کنید

و

با دانش خود درآمد کسب کنید

زمانبندی و انجام یک کار تکراری و اتوماتیک در پس زمینه وب

سلام به ITPRO های عزیز و تبریک سال نو. حالتی را در نظر بگیرید که شما در وب سایت خود باید یک سری فایل ها را حذف کنید و یا هر یک ساعت یک بار برای مدیر ایمیل بفرستید و یا داده های خود را آرشیو کنید. در کل اگر بخواهید در وب سایت خود در بازه های زمانی یک کار تکراری را انجام بدهید چه کاری باید انجام دهید. انجام این کار در برنامه نویسی دسکتاپ بسیار آسان است. شما یک Thread می سازید و یا از تایمر استفاده می کنید ولی در وب نمی توان به همین راحتی عمل زمان بندی را انجام داد. در این آموزش روشی را به شما یاد می دهیم که با کمک آن بتوانید در سایت های asp.net یک کار تکراری را در بازه های مختلف انجام دهید. با استفاده از این روش شما می توانید یک کار را هر روز و یا هر ساعت یا هر دقیقه و بازه های زمانی دیگر انجام دهید. برای این کار مراحل زیر را برای ساخت یک پروژه با ما همراهی کنید.


ساخت پروژه


در ابتدا ویژوال استودیو را باز کرده و از منوی file بر روی new و سپس project کلیک می کنیم. در این صورت پنجره ای باز می شود که اجازه انتخاب نوع پروژه را به شما می دهد. مانند شکل زیر

زمانبندی و انجام یک کار تکراری و اتوماتیک در پس زمینه وب

در این صفحه مانند عکس از سمت چپ web را انتخاب کنید و از بخش سمت راست Asp.Net Web Application را انتخاب کنید. دقت داشته باشید که در این آموزش ما از زبان سی شارپ استفاده می کنیم. یک نام برای پروژه در پایین پنجره انتخاب کنید و بر روی OK کلیک کنید. در این صورت یک صفحه مانند عکس زیر ظاهر خواهد شد که شما می توانید نوع پروژه را انتخاب کنید که می توانید از انواع پروژه های Asp.Net که web form, mvc , web api می باشد انتخاب کنید. مهم نیست که نوع پروژه ای که انتخاب می کنید کدام باشد. برای مثال ما در این پروژه نوع MVC را انتخاب می کنیم و بر روی ok کلیک می کنیم.

زمانبندی و انجام یک کار تکراری و اتوماتیک در پس زمینه وب

در این حالت پروژه شروع به ساخته شدن خواهد کرد و فایل های مورد نیاز ساخته می شود. بعد از این که پروژه ساخته شد لیست فایل ها به شکل زیر خواهد بود

زمانبندی و انجام یک کار تکراری و اتوماتیک در پس زمینه وب


افزودن بسته ها


برای این که امکان زمانبندی به پروژه اضافه شود باید بسته quartz.net را بر روی پروژه نصب کنیم. برای این کار در پنجره solution explorer که عکس آن را در بالا می بینید بر روی نام پروژه کلیک راست کنید و Manage Nuget Packages را انتخاب کنید. تا پنجره زیر باز شود.

زمانبندی و انجام یک کار تکراری و اتوماتیک در پس زمینه وب

در این تصویر بسته هایی که بر روی پروژه شما نصب شده است نشان داده می شود و اگر آپدیتی برای هرکدام ارایه شده باشد نشان داده می شود. حال برای این که quartz را نصب کنیم به tab اولی یعنی browse می رویم و در قسمت سرچ عبارت quartz.net را جستجو کنید. دقت کنید که به اینترنت متصل باشید. بعد از این که جستجو کردید نتیجه جستجو به شما نشان داده می شود که بر روی اولین بسته کلیک کنید و از سمت راست گزینه install را انتخاب کنید. در این حالت فرایند نصب شروع خواهد شد و بسته ها دانلود شده و بر روی پروژه شما نصب می شوند. بعد از این که فرایند نصب تکمیل شد صفحه بسته های شما به شکل زیر خواهد شد

زمانبندی و انجام یک کار تکراری و اتوماتیک در پس زمینه وب

این شکل بیان می کند که بسته نصب شده است زیرا که روی quartz تیک سبز رنگ خوده است.


شروع برنامه نویسی با quartz


پس از نصب بسته ها نوبت به برنامه نویسی می رسد. بسته quartz سه بخش دارد. Job, trigger, scheduler که با استفاده از این بخش ها عمل زمان بندی را انجام می دهیم. Job کاری است که باید انجام شود. Trigger مشخص می کند که چه زمانی و با چه فاصله زمانی عمل ما تکرار شود. Job , trigger باهم در داخل scheduler قرار می گیرند. یک job یک کلاس است که از اینترفیس IJob ارث بری می کند. این اینترفیس یک متد به نام execute دارد که باید پیاده سازی شود. برای مثال ما می خواهیم یک برنامه بنویسیم که هر چند دقیقه یک بار یک ایمیل ارسال کند و تاریخ ارسال ایمیل را در فایل بنویسد برای همین یک کلاس در پروژه می سازیم و نام آن را EmailJob قرار می دهیم. برای این کار بر روی پروژه کلیک راست می کنیم و Add و سپس گزینه آخر که class است را انتخاب کرده و نام آن را EmailJob قرار می دهیم و بر روی ok کلیک می کنیم. حال کلاس ما ساخته می شود. کد کلاس را باید به شکل زیر تغییر دهیم

namespace WebApplication1
{
    using System;

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

حال باید متد Execute را پیاده سازی کنیم. گفتیم که می خواهیم یک ایمیل ارسال کنیم و زمان ارسال را در فایل ذخیره کنیم. برای این کار کد زیر را می نویسیم

public void Execute(IJobExecutionContext context)
        {
            using (var message = new MailMessage("user@gmail.com", "user@live.co.uk"))
            {
                message.Subject = "Test";
                message.Body = "Test at " + DateTime.Now;
                using (var client = new SmtpClient
                {
                    EnableSsl = true,
                    Host = "smtp.gmail.com",
                    Port = 587,
                    Credentials = new NetworkCredential("user@gmail.com", "password")
                })
                {
                    client.Send(message);
                }
               
            }
            File.AppendAllText("time.data", DateTime.Now.ToString("F"));
        }

دقت کنید که اطلاعاتی که ما برای ایمیل دادیم اطلاعات تستی بوده و کار نمی کند ولی شما اگر اطلاعات درست وارد کنید مشکل حل خواهد شد. حال باید یک scheduler هم بسازیم. برای این کار یک کلاس دیگر به نام MyScheduler در پروژه می سازیم. در این کلاس هم باید job را مشخص کنیم و هم باید trigger را بسازیم. برای این کار ما یک متد به نام Start تعریف کرده ایم که کد آن به شکل زیر خواهد بود

using Quartz;
using Quartz.Impl;

namespace WebApplication1
{
    public class MyScheduler
    {
        public static void Start()
        {
            var scheduler = StdSchedulerFactory.GetDefaultScheduler();
            scheduler.Start();
            var job = JobBuilder.Create<EmailJob>().Build();
            var trigger = TriggerBuilder.Create()
                .WithDailyTimeIntervalSchedule(
                    builder =>
                        builder.WithIntervalInMinutes(10)
                            .OnEveryDay()
                            .StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(0, 0))).Build();
            scheduler.ScheduleJob(job, trigger);
        }
    }
}

در کد بالا یک scheduler تعریف کرده ایم و آن را استارت کرده ایم. سپس job را مشخص کرده ایم که گفته ایم از EmailJob یک job ساخته شود. سپس یک Trigger ساخته ایم که می گوییم هر روز و هر 10 دقیقه یک بار اجرا شود و هر روز از ساعت 00:00 شروع به کار نماید. در انتها هم گفته ایم که scheduler شروع به کار کند.

حال بعد از این که این کار ها را انجام دادیم باید کل Scheduler را در یک قسمت روشن کنیم. برای این کار ما باید در فایل global زمانبند را روشن کنیم برای این کار باید فایل Global.asax را باز کنیم و کد زیر را به متد Application_start اضافه کنیم.

MyScheduler.Start();

که کد این فایل به شکل زیر خواهد شد.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;

namespace WebApplication1
{
    public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
            MyScheduler.Start();
        }
    }
}

به همین سادگی!! البته شاید ارسال ایمیل به خاطر اطلاعات نادرست خطا بدهد ولی نوشتن در فایل به درستی انجام خواهد گرفت. برای این که به فایل time.data دسترسی داشته باشید باید به مسیر

C:\program files (x86)\IIS Express\

بروید خواهید دید که تاریخ ها ثبت می شود پس برنامه به درستی کار می کند. امید وارم که از این آموزش استفاده کرده باشید. ITPRO باشید

نویسنده: مهدی عادلی فر

منبع: Itpro

هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد.

#تکرار_کارها_در_asp.net #زمانبندی_کارها_با_quartz #آموزش_ASP.NET_MVC_4.0 #کار_با_quartz #یادگیری_زبان_برنامه_نویسی_سی_شارپ #task_scheduler_یا_زمانبندی_وظایف #آموزش_برنامه_نویسی_سی_شارپ #آموزش_asp.net
3 نظر
مسلم هادی

اگه بخوایم با زدن یه دکمه به تعداد مشخصی ایمیل ، با فاصله زمانی مشخص، ایمیل ارسال بشه، امکانش هست؟

مهدی عادلی فر

بله شما بخش ارسال ایمیل رو زمان بندی می کنید و ایمیل ها با فاصله زمانی مشخص ارسال خواهند شد.

برنامه نویس

لطفا اگر ممکن هست آموزش نسخه 3 نیز در سایت قرار دهید

باسپاس

نظر شما
برای ارسال نظر باید وارد شوید.
از سرتاسر توسینسو
تنظیمات حریم خصوصی
تائید صرفنظر
×

تو می تونی بهترین نتیجه رو تضمینی با بهترین های ایران بدست بیاری ، پس مقایسه کن و بعد خرید کن : فقط توی جشنواره پاییزه می تونی امروز ارزونتر از فردا خرید کنی ....