我正在尝试构建一个页面,允许用户启动存储过程,然后继续使用站点的其余部分,而无需等待该过程完成。
我已尝试为此调用创建后台工作线程和辅助EDMX,但当前代码运行时网站仍然没有响应(通常需要一到两分钟)。
protected void SaveReversal_Click(object sender, EventArgs e)
{
if (PeriodList.SelectedValue != "")
{
var bw = new BackgroundWorker();
bw.DoWork += new DoWorkEventHandler(AsyncReverseDataload_DoWork);
bw.WorkerReportsProgress = false;
bw.WorkerSupportsCancellation = false;
bw.RunWorkerAsync(Convert.ToInt32(PeriodList.SelectedValue));
}
}
private void AsyncReverseDataload_DoWork(object sender, DoWorkEventArgs e)
{
int TrackerDetailKey = (int)e.Argument;
using (AsyncEntities ar = new AsyncEntities())
{
IObjectContextAdapter dbcontextadapter = (IObjectContextAdapter)ar;
dbcontextadapter.ObjectContext.CommandTimeout = 600;
try
{
var results = ar.ReverseDataload(TrackerDetailKey);
}
catch (Exception ex)
{
Console.Write(ex.ToString());
}
}
}
如何让这个实际运行,以便在开始执行存储过程后网站仍然对用户做出响应?
答案 0 :(得分:2)
因为你说你可能需要一两分钟才能处于“火灾和遗忘”状态(我认为是这样)。
以下是一些选项:
-ThreadPool使用Task.Run,Task.Factory.StartNew等。但是,我真的认为这是一个坏主意!
IIS / ASP.NET必须回收应用程序。如果在进行此回收时后台线程正在运行,则该工作将丢失。
-QueueBackgroundWorkItem,如果你的任务最多需要30秒
,请使用此选项-IRegisteredObject,它是一个后台工作者+最后一次机会
第三方图书馆 “迟发型” Nito.AspNetBackgroundTasks包,查看github页面如何使用它。- 调用超出页面范围的方法,即来自asmx / wcf,可能嵌入到项目中。
除了所有这些之外,我还会选择可靠的解决方案
- 控制台应用程序或
-Service,可以从WebApp直接在“任务队列”中添加任务,然后使用日志和必要的逻辑从那里安全执行。
希望这会有所帮助。