C# 在后台执行CreateAsync和UpdateAsync
我的情况是,我创建对象,并在数据库中保存和更新这些对象。我有一个对象插槽计划,默认情况下,大约有123个插槽对象,我必须将它们写入数据库 根据具体情况,我必须创建许多插槽计划,因此创建和更新可能会发生数百或数千次,这非常耗时。 (为我创建10个吃角子老虎机的计划持续了大约3分钟) 我知道这确实需要时间,但如何让创建和更新在后台运行,并允许用户继续在程序中导航到独立于插槽和插槽计划的部件 以下是我当前代码的一个片段:C# 在后台执行CreateAsync和UpdateAsync,c#,asp.net-mvc,async-await,C#,Asp.net Mvc,Async Await,我的情况是,我创建对象,并在数据库中保存和更新这些对象。我有一个对象插槽计划,默认情况下,大约有123个插槽对象,我必须将它们写入数据库 根据具体情况,我必须创建许多插槽计划,因此创建和更新可能会发生数百或数千次,这非常耗时。 (为我创建10个吃角子老虎机的计划持续了大约3分钟) 我知道这确实需要时间,但如何让创建和更新在后台运行,并允许用户继续在程序中导航到独立于插槽和插槽计划的部件 以下是我当前代码的一个片段: [HttpPost] public ActionResult B
[HttpPost]
public ActionResult BookingRequestDetails(BookingRequestDetails model)
{
//Omitted code
if(shipmentinfo.ShipmentType.Equals("Export"))
CreateSlotPlan((DateTime)shipmentinfo.PickupDate, (DateTime shipmentinfo.PickupDateLast);
return RedirectToAction("Home");
}
public void CreateSlotPlan(DateTime firstdate, DateTime lastdate)
{
for (DateTime i = firstdate; i <= lastdate; i = i.AddDays(1))
{
SlotPlan slotplan = slotplanmanager.FindByDate(i);
if (slotplan == null)
{
slotplan = new SlotPlan { Date = i };
slotplanmanager.CreateSlotPlan(slotplan);
for (int j = 1; j <= 9; j++)
{
Slot slot = new Slot
{
Location = "A" + j
};
slotmanager.CreateSlot(slot);
slotplan.Slots.Add(slot);
slotplanmanager.UpdateSlotPlan(slotplan);
slotmanager.UpdateSlot(slot);
}
for (int j = 1; j <= 36; j++)
{
Slot slot = new Slot
{
Location = "B" + j
};
slotmanager.CreateSlot(slot);
slotplan.Slots.Add(slot);
slotplanmanager.UpdateSlotPlan(slotplan);
slotmanager.UpdateSlot(slot);
}
for (int j = 1; j <= 12; j++)
{
Slot slot = new Slot
{
Location = "C" + j
};
slotmanager.CreateSlot(slot);
slotplan.Slots.Add(slot);
slotplanmanager.UpdateSlotPlan(slotplan);
slotmanager.UpdateSlot(slot);
}
for (int j = 1; j <= 6; j++)
{
Slot slot = new Slot
{
Location = "D" + j
};
slotmanager.CreateSlot(slot);
slotplan.Slots.Add(slot);
slotplanmanager.UpdateSlotPlan(slotplan);
slotmanager.UpdateSlot(slot);
}
for (int j = 1; j <= 60; j++)
{
Slot slot = new Slot
{
Location = "E" + j
};
slotmanager.CreateSlot(slot);
slotplan.Slots.Add(slot);
slotplanmanager.UpdateSlotPlan(slotplan);
slotmanager.UpdateSlot(slot);
}
}
}
}
[HttpPost]
公共操作结果BookingRequestDetails(BookingRequestDetails模型)
{
//省略代码
if(shipmentinfo.ShipmentType.Equals(“导出”))
CreateSlotPlan((DateTime)shipmentinfo.PickupDate,(DateTime shipmentinfo.PickUpdateList);
返回操作(“主页”);
}
public void CreateSlotPlan(日期时间firstdate、日期时间lastdate)
{
对于(DateTime i=firstdate;i如果您确实需要立即重定向,然后将此工作排入队列,则可以使用。您可能会从中获得一些见解。控制器入口点如下所示:
[HttpPost]
public ActionResult BookingRequestDetails(BookingRequestDetails model)
{
// Omitted code
if(shipmentinfo.ShipmentType.Equals("Export"))
{
// This will return immediately, but the work will be queued up
HostingEnvironment.QueueBackgroundItem(() =>
CreateSlotPlan((DateTime)shipmentinfo.PickupDate,
(DateTime)shipmentinfo.PickupDateLast));
}
return RedirectToAction("Home");
}
安排可以在后台运行的任务,该任务独立于任何请求
如果确实需要立即重定向,然后将此工作排队,则可以使用。您可能会从中获得一些见解。控制器入口点如下所示:
[HttpPost]
public ActionResult BookingRequestDetails(BookingRequestDetails model)
{
// Omitted code
if(shipmentinfo.ShipmentType.Equals("Export"))
{
// This will return immediately, but the work will be queued up
HostingEnvironment.QueueBackgroundItem(() =>
CreateSlotPlan((DateTime)shipmentinfo.PickupDate,
(DateTime)shipmentinfo.PickupDateLast));
}
return RedirectToAction("Home");
}
安排可以在后台运行的任务,该任务独立于任何请求
不幸的是,这不是一个C#问题。这是一个javascript问题。你需要学习HTML5/JS中一种称为AJAX的技术。async
wait
不会以任何方式或形式影响客户端。谢谢你@Aron。当我在客户端单击submit时,页面只会加载,直到所有数据库内容完成,然后重定向开始了。我正在努力实现在数据库完成创建和更新时执行重定向操作。我熟悉AJAX,我会尝试一下。打电话给我的老式系统,但是如果你有需要几分钟的任务,为什么不使用System.ComponentModel.BackgroundWorker?当然,创建完整的应用程序所需的额外时间是不够的与创建插槽所需的时间相比,线程算不上什么?@HaraldDutch,因为BackgroundWorker无法使AppDomain保持活动状态,并且它可能在您的工作完成之前关闭。想象一下,在一个控制台程序中,您使用BackgroundWorker,但没有放置console.ReadLine()
在main的末尾,而只是执行了static void main(){StartMyBackgroundWorker();}
。你希望BackgroundWorker能够可靠地完成你在这个程序中需要几分钟才能完成的工作吗?不幸的是,这不是一个C问题。这是一个javascript问题。你需要学习HTML5/JS中一种称为AJAX的技术。异步等待不会以任何方式或形式影响客户端。谢谢i you@Aron。当我在客户端单击submit时,页面将加载,直到所有数据库内容完成,然后重定向开始。我正在尝试实现在数据库完成创建和更新时执行RedirectToAction。我熟悉AJAX,我会尝试使用它。请致电我的老式用户,但如果您有任务,请联系我这需要几分钟,为什么不使用System.ComponentModel.BackgroundWorker?创建完整线程所需的额外时间与创建插槽所需的时间相比肯定算不了什么?@HaraldDutch,因为BackgroundWorker不会让AppDomain保持活动状态,它可能会在您的工作完成之前关闭。想象一下一个控制台程序您使用BackgroundWorker,但没有在main的末尾放置Console.ReadLine()
,而是执行了static void main(){StartMyBackgroundWorker();}
。您希望BackgroundWorker能够可靠地完成您在本程序中需要几分钟才能完成的工作吗?请注意,QueueBackgroundItem
只会可靠地为您提供额外的90秒时间来完成工作(长度是HttpRuntimeSection.ShutdownTimeout
和processModelshutdownTimeLimit
的最小值,默认值为90)。对于需要3分钟的事情,我不会依赖于QueueBackgroundItem
。重要的一点是,QueueBackgroundItem
只会给您额外90秒的时间来完成工作(长度是HttpRuntimeSection.ShutdownTimeout
和processModelshutdownTimeLimit
的最小值,默认值为90)。对于需要3分钟的内容,我不依赖于QueueBackgroundItem
。