#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 для ее запуска каждое утро. Используйте базу данных для отслеживания того, кому нужно электронное письмо. Тогда вам не нужно беспокоиться о потоковой передаче, или о том, как отслеживать, когда она выполняется, или о чем-либо еще. Однако в вашем приложении может быть больше, чем я знаю…