انجام کار مشخص در موعد مشخص

علی شاکری
31 فروردين ۱۴۰۱

سلام استاد اشراقی عزیز

استاد من میخام سررسید اقساط که رسید خودکار برای کاربر پیام بره

چطوری باید انجامش بدم؟

چطوری سررسید اقساط رو چک کنم؟

پکیج خاصی باید نصب کنم؟

701

6 پاسخ
  • محمد اشرافی31 فروردين ۱۴۰۱

    سلام سلامت باشید

    راحت ترین راه اینه که هر روز روی یه زمان خاص برید دیتابیس رو چک کنید و اگر چیزی بود واکشی کنید و باقی کار رو انجام بدین

    برای اینکه بتونید اینو پیاده سازی کنید یا می تونید از Backgroun Service های خود asp استفاده کنید یا از Hangfire یا از Quartz

  • علی شاکری31 فروردين ۱۴۰۱

    نمونه مدی چیزی ندارید استاد؟

  • محمد اشرافی1 ارديبهشت ۱۴۰۱

    برای راه اندازی hangfire میتونید از این لینک استفاده کنید

    https://vrgl.ir/bMkS1

    این قسمت از مقاله رو بخونید : 3 - تسک های Recurring

    ---------------------------------------------------------------------------------

    برای استفاده از Background service باید این کار رو انجام بدین : 

    اول یک کلاس بسازید برای انجام کار : ( این یک نمونه اش هست که من توی یکی از پروژه هام استفاده کردم

    public class GetUsdPriceTask : BackgroundService
    {
        private readonly IUsdPriceService _usdPriceService;
        private readonly ISettingsService _settingsService;
        private readonly ILogger<GetUsdPriceTask> _logger;
        public GetUsdPriceTask(IUsdPriceService usdPriceService, ISettingsService settingsService, ILogger<GetUsdPriceTask> logger)
        {
            _usdPriceService = usdPriceService;
            _settingsService = settingsService;
            _logger = logger;
        }
    
        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            await Task.Delay(10000, stoppingToken);
            _logger.LogInformation("Usd Task Started");
            while (true)
            {
                try
                {
                    //Choon Rooye Host Haye Eshtraki Momkene Hay Proje Reset Beshe Bayad Check Konam Bebinam Akharin 
                    //Vaghti ke Ghimat Ro Gereftam Kay Boode
                    var settings = await _settingsService.GetSettings();
                    if (settings?.LastCheckUsdPrice.AddHours(10) <= DateTime.Now)
                    {
                        var usdPrice = await _usdPriceService.GetUsdPriceFromTooman();
                        await _settingsService.SetUsdPrice(usdPrice);
                    }
    
                }
                catch (Exception ex)
                {
                    _logger.LogError(ex.Message, ex);
                }
                //12 hours
                await Task.Delay(43200000, stoppingToken);
            }
        }
    }

    بعد اینو به Program.cs اضافه کنید 

    builder.Services.AddHostedService<GetUsdPriceTask>();
  • علی شاکری1 ارديبهشت ۱۴۰۱

    استاد توی این نمونه کد شما کجاش مشخص کنیم مثلا ساعت 10 صبح ارسال کنه و بره تا 24 ساعت بعد؟

  • محمد اشرافی1 ارديبهشت ۱۴۰۱

    توی نمونه کد من ، کار انجام میشه و میره برای 12 ساعت بعد ، حالا شما خودتون می تونید تغییرش بدین به 24 ساعت بعد و اگر هم قراره روی هاست های اشتراکی پروژه اتون رو قرار بدین ، باید آخرین باری که این کار انجام شده رو هم توی دیتابیس ذخیره کنید

     

      if (settings?.LastCheckUsdPrice.AddHours(10) <= DateTime.Now)
                    {
                        var usdPrice = await _usdPriceService.GetUsdPriceFromTooman();
                        await _settingsService.SetUsdPrice(usdPrice);
                    }

    توی کد بالا چک میشه اگر 10 ساعت از آخرین اجرا گذشته بود بعد میاد کد مربوطه رو اجرا میکنه

     //12 hours
                await Task.Delay(43200000, stoppingToken);

    اینجا هم 12 ساعت Delay ایجاد میکنم

  • علی شاکری2 ارديبهشت ۱۴۰۱

    استاد از این پکیج hangfire استفاده کردم خیلی عالی بود

    فقط اینکه الان روی لوکال داره درست کار میکنه ان شاالله که روی هاست هم درست کار کنه