انجام کار مشخص در موعد مشخص
سلام استاد اشراقی عزیز
استاد من میخام سررسید اقساط که رسید خودکار برای کاربر پیام بره
چطوری باید انجامش بدم؟
چطوری سررسید اقساط رو چک کنم؟
پکیج خاصی باید نصب کنم؟
پاسخ ها
محمد اشرافی
سلام سلامت باشید
راحت ترین راه اینه که هر روز روی یه زمان خاص برید دیتابیس رو چک کنید و اگر چیزی بود واکشی کنید و باقی کار رو انجام بدین
برای اینکه بتونید اینو پیاده سازی کنید یا می تونید از Backgroun Service های خود asp استفاده کنید یا از Hangfire یا از Quartz
علی شاکری
نمونه مدی چیزی ندارید استاد؟
محمد اشرافی
برای راه اندازی 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>();
علی شاکری
استاد توی این نمونه کد شما کجاش مشخص کنیم مثلا ساعت 10 صبح ارسال کنه و بره تا 24 ساعت بعد؟
محمد اشرافی
توی نمونه کد من ، کار انجام میشه و میره برای 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 ایجاد میکنم
علی شاکری
استاد از این پکیج hangfire استفاده کردم خیلی عالی بود
فقط اینکه الان روی لوکال داره درست کار میکنه ان شاالله که روی هاست هم درست کار کنه