Поток или прослушиватель, который будет проверять некоторые данные в базе данных ASP.NET

#c# #asp.net-mvc #multithreading #listener

#c# #asp.net-mvc #многопоточность #прослушиватель

Вопрос:

Я хотел бы создать поток или прослушиватель (я довольно новичок в потоковой обработке, поэтому я спрашиваю здесь), который будет проверять каждый день, имеет ли Return_Date значение null или нет, и если оно равно null, он отправит электронное письмо мне и человеку, который арендует предметы, которые он / онаеще не вернул их. Мне просто нужна функция, которая создаст этот поток / прослушиватель, все остальное, например, отправку электронных писем, я сделаю сам.

Это мой класс ItemRent:

 public class ItemRent
{
    [Key]
    public int ItemRentID { get; set; }
    (...)
    public DateTime Rent_Date { get; set; }

    public string Time { get; set; }

    public Nullable<DateTime> Plan_Return_Date { get; set; }

    public Nullable<DateTime> Return_Date { get; set; }
}
  

Это моя конечная функция, которая добавляет данные в базу данных:

 [HttpPost, ActionName("SaveRent")]
    public ActionResult SaveRentConfirmed(int ID)
    {
        var temp = from x in db.ItemRentLists
                   where x.ItemRentID == ID
                   select x;
        SavingRent(temp);
        ItemRent itemRent = db.ItemRents.Find(ID);
        itemRent.Confirmed = true;
        db.Entry(itemRent).State = EntityState.Modified;
        db.SaveChanges();

// HERE I WOULD LIKE TO START A THREAD/LISTENER AND CONTINUE E.G. ADDING NEW RENTS OR DO ANYTHING ELSE IN MEANTIME

        return RedirectToAction("Details", new { id = ID });
    }
  

Что именно я должен сделать?

Ответ №1:

Это создаст поток для запуска кода в private void MyVoidMethod()

 myThread = new Thread(new ThreadStart(MyVoidMethod));
myThread.IsBackground = true;
myThread.Start();
  

Если вам нужно передать параметры, вместо этого используйте ParameterizedThreadStart .

Есть много хороших руководств по этой теме…

Комментарии:

1. Тогда, если в MyVoidMethod ReturnDate не будет null, и тогда я хотел бы остановить этот поток, как я могу это сделать?

2. private void MyVoidMethod(int ID) { var ItemRent = db.ItemRents.Find(ID); if (ItemRent.Return_Date == null) { if (ItemRent.Plan_Return_Date < DateTime.Today) { //SendEmail(); } } else { //stop thread } }

3. Вы можете полностью исключить оператор else — тогда, если Return_Date равно null, вы дойдете до конца метода. Поток будет останавливаться всякий раз, когда выполняется метод, и должен быть собран мусор.

4. Я бы хотел, чтобы этот поток проверял каждый день, имеет ли значение ReturnDate значение null. Если это значение равно нулю, тогда есть другое if, и если это true, то я бы хотел, чтобы был выполнен метод SendEmail() . Это следует повторять до тех пор, пока значение ReturnDate не станет равным null (если значение ReturnDate не равно null, поток должен остановиться)

5. Ну, я понятия не имею, как вы структурируете это приложение… Вероятно, вы могли бы использовать таймер, который срабатывает каждый день, предполагая, что приложение никогда не будет закрыто, но я не считаю это самым надежным методом. Я бы лично поместил весь этот код в простое консольное приложение или что-то в этом роде и использовал запланированную задачу Windows для ее запуска каждое утро. Используйте базу данных для отслеживания того, кому нужно электронное письмо. Тогда вам не нужно беспокоиться о потоковой передаче, или о том, как отслеживать, когда она выполняется, или о чем-либо еще. Однако в вашем приложении может быть больше, чем я знаю…