异步运行ASP.NET Entity Framework 6存储过程

时间:2016-04-05 21:39:43

标签: c# asp.net stored-procedures asynchronous entity-framework-6

我正在尝试构建一个页面,允许用户启动存储过程,然后继续使用站点的其余部分,而无需等待该过程完成。
我已尝试为此调用创建后台工作线程和辅助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());
            }
        }
    }

如何让这个实际运行,以便在开始执行存储过程后网站仍然对用户做出响应?

1 个答案:

答案 0 :(得分:2)

因为你说你可能需要一两分钟才能处于“火灾和遗忘”状态(我认为是这样)。

以下是一些选项:
-ThreadPool使用Task.Run,​​Task.Factory.StartNew等。但是,我真的认为这是一个坏主意! IIS / ASP.NET必须回收应用程序。如果在进行此回收时后台线程正在运行,则该工作将丢失。

-QueueBackgroundWorkItem,如果你的任务最多需要30秒

,请使用此选项

-IRegisteredObject,它是一个后台工作者+最后一次机会

第三方图书馆  “迟发型”  Nito.AspNetBackgroundTasks包,查看github页面如何使用它。

- 调用超出页面范围的方法,即来自asmx / wcf,可能嵌入到项目中。

除了所有这些之外,我还会选择可靠的解决方案   - 控制台应用程序或
 -Service,可以从WebApp直接在“任务队列”中添加任务,然后使用日志和必要的逻辑从那里安全执行。

希望这会有所帮助。