[英]Run ASP.NET Entity Framework 6 stored procedure asynchronously
我正在尝试构建一个页面,该页面允许用户启动存储过程,然后继续使用网站的其余部分,而不必等待该过程完成。
我曾尝试为此调用创建后台工作线程和辅助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());
}
}
}
我如何使它实际运行,以便站点在开始执行存储过程后仍能对用户做出响应?
因为您说可能要花费一到两分钟的时间,所以您处于“失火忘却”的境地(我认为是这样)。
以下是一些选项:
-ThreadPool使用Task.Run,Task.Factory.StartNew等。但是,我真的认为这是一个坏主意! IIS / ASP.NET必须回收该应用程序。 如果在进行回收时后台线程正在运行,则该工作将丢失。
-QueueBackgroundWorkItem,如果您的任务最多需要30秒,请使用它
-IRegisteredObject是后台工作者+最后的机会
第三方库“ HangFire” Nito.AspNetBackgroundTasks包,请检查github页面如何使用它。
-调用页面范围之外的方法,该方法来自asmx / wcf,可能嵌入在项目中。
除了所有这些,我会寻求一个可靠的解决方案
-控制台应用程序或
-Service,可以从WebApp直接在“任务队列”中添加任务,然后从那里安全地执行日志和必要的逻辑。
希望这会有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.