【问题标题】:Run ASP.NET Entity Framework 6 stored procedure asynchronously异步运行 ASP.NET Entity Framework 6 存储过程
【发布时间】:2016-04-05 21:39:42
【问题描述】:

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

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

【问题讨论】:

  • 使方法异步?

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


【解决方案1】:

既然你说这可能需要一两分钟,你就处于“一劳永逸”的境地(至少我是这么认为的)。

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

-QueueBackgroundWorkItem ,如果您的任务长达 30 秒,请使用它

-IRegisteredObject 是后台工作者 + 最后的机会

-第三方库 “挂火” Nito.AspNetBackgroundTasks 包,查看github页面如何使用。

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

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

希望这会有所帮助。

【讨论】:

  • 谢谢,里面有很多很好的信息!我最终将工作转为 WCF 服务,并将 IsOneWay 设置为 true。页面调用它,然后让用户继续正常使用网站的其余部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-05
  • 1970-01-01
  • 2019-07-07
  • 2014-01-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多