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

سوال شده توسط: علی شاکری

تاریخ ثبت: ۱۴۰۱/۰۱/۳۱

بازدید: 459

پاسخ: 6

تگ: Asp.net Core


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

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

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

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

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

پاسخ ها
user

محمد اشرافی

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

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

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

user

علی شاکری

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

user

محمد اشرافی

برای راه اندازی 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>();
user

علی شاکری

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

user

محمد اشرافی

توی نمونه کد من ، کار انجام میشه و میره برای 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 ایجاد میکنم

user

علی شاکری

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

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

برای ثبت پاسخ باید خود شوید

محبوب ترین مقالات