当ASP.NET C#页面转到另一个页面时,在后台运行存储过程

时间:2018-08-13 17:07:42

标签: c# sql asp.net

我想提交我的表单,然后在后台运行存储过程(SQL)时将其转到另一个页面(告诉用户他们将在完成后收到电子邮件)。

我不希望用户等待30分钟才能完成搜索,然后再转到另一页。我该怎么做?

// Clicking on the Search button    
protected void btnSearch_Click(object sender, EventArgs e)
{
    Guid SearchGUID;
    SearchGUID = Guid.NewGuid();

    Hashtable htSearch = new Hashtable();
    htSearch["value"] = 2;

    // Run the stored procedure (takes 30 mins)
    objSmart.RunSearch(htSearch);

    // Redirect to the other page
    Response.Redirect("Search.aspx?search=" + SearchGUID.ToString());
}

2 个答案:

答案 0 :(得分:6)

如果您的后台任务仅需30〜90秒,则可以使用Async,线程池/任务库或任何其他解决方案来处理。但是,一旦开始花费几分钟,或者您的情况是30分钟以上,您就需要一个更强大的过程外解决方案。 ASP.NET的体系结构不是为长时间运行的后台线程而设计的。 IIS将随机回收应用程序池/域以优化资源使用,尽管它会尽最大努力使线程完成,但并不能保证。有关一些背景和建议,请参见Scot Hanselman's blog post on this subject

根据您的应用程序约束,您可以考虑以下几种解决方案:

  • 如果您使用的是MS SQL Server,则可以将存储过程和完成电子邮件封装在kick off from your web app的SQL代理作业中。 (尽管效果不佳,您甚至可以在SQL Server中运行.NET代码。)
  • 您可以编写一个真正的后台进程以作为EXE运行并托管在Windows Task Scheduler中。您的网络应用可以手动启动此任务,例如C# start a scheduled task
  • 您可以使用第三方后台任务/队列框架,例如https://www.hangfire.io/

答案 1 :(得分:0)

您需要以mentioned here的身份运行方法async。

这将调用该方法,然后转到下一个项目。