asp.net,而第一个请求处理允许点击第二个请求

在Asp.net Web窗体应用程序中,如果需要很长时间,我有生成报告按钮和取消按钮以取消报告生成过程。

当我单击生成报告时,它执行繁重的任务,3秒后我尝试通过单击取消按钮取消这个繁重的任务。

但是在一段时间延迟之后调用取消按钮单击的服务器端代码。

我甚至在JavaScript尝试使用window.stop()来停止页面加载并快速命中服务器代码,但仍有延迟。

码:

 protected void btnExportExcel_Click(object sender, EventArgs e) { // Doing Heavy Task to Generate Report } protected void btnCancel_Click(object sender, EventArgs e) { if (Response.IsClientConnected) { HttpContext.Current.ApplicationInstance.CompleteRequest(); } }  function StopPageLoading() { try { window.stop(); } catch (exception) { document.execCommand('Stop'); // for IE and other browsers } } 

如何在当前请求处理时允许快速点击启动另一个请求?

如何让UI响应?

更新:

重现这种情况:

  1. 我单击“导出到Excel”,需要7分钟才能处理。
  2. 在处理时我点击取消按钮,需要5分钟才能取消。

我读到在Asp.NET中无法进行并发请求 ,因为会话状态会产生独占锁。

那么如何快速取消?

使我的方法async有助于克服会话状态独占锁定问题吗?

正如你提出的另一个问题 ,你可以这样做

 public partial class Contact : Page { private static CancellationTokenSource tokenSource = new CancellationTokenSource(); protected void Page_Load(object sender, EventArgs e) { } protected async void btnExportExcel_Click(object sender, EventArgs e) { CancellationToken cToken = tokenSource.Token; cToken.Register(() => cancelNotification()); try { await Task.Run(() => { cToken.ThrowIfCancellationRequested(); GenerateReport(sender, cToken); }, cToken); } catch(OperationCanceledException) { } } private void GenerateReport(object sender, CancellationToken ct) { // Just to Simulate Export to excel Thread.Sleep(70000); } protected void btnCancel_Click(object sender, EventArgs e) { tokenSource.Cancel(); } private static void cancelNotification() { // Do your stuff when the user is canceld the report generation } } 

在你的Page.aspx

需要这样的东西

 <%@ Page Async="true" EnableSessionState="false" %> 

我希望这可以帮助你!

虽然,你可以做到或不做(我不确定),在ASP.NET中创建一个长时间运行的任务通常不是一个好主意,特别是如果它们是后台任务。 因此,有一些辅助库可用于此目的。

  1. HangFire http://docs.hangfire.io Hangfire允许您以非常简单但可靠的方式启动请求处理管道之外的方法调用。 这些方法调用在后台线程中执行,并称为后台作业。 这种支持使用取消令牌来取消后台作业
  2. Quarz.NET我从未尝试过Quarz.NET
  3. 或者你必须自己做。 我知道一些项目需要一些专门用于运行后台和耗时任务的专用服务器。 所以网站只是一个前端层,设置了一些控制任务取消的标志

问题出在IIS(或任何其他Web服务器)体系结构中。 服务器向客户端(浏览器)返回响应并忘记它 。 您的第一个请求( btnExcelExport_Click )必须在它返回对浏览器的响应之前完成。 点击btnCancel启动一个新的请求,该请求对第一个请求一无所知。
解决方法是将长作业发送到另一个thread 。 可以使用发送到新线程的状态object与该线程进行通信。 像这样的东西。

 <%@ Page Language="C#" %>     Long Job   

您是否尝试在代码中使用async / await操作而不是同步操作

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/async/

当报告生成调用是异步的时,一旦报告生成过程开始,则重定向到UI。 现在可以在需要时单击取消按钮。

这有帮助吗?