Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET WebMethod在长时间运行的SQL过程上保留线程池线程_C#_Asp.net_Multithreading_Asynchronous_Webforms - Fatal编程技术网

C# ASP.NET WebMethod在长时间运行的SQL过程上保留线程池线程

C# ASP.NET WebMethod在长时间运行的SQL过程上保留线程池线程,c#,asp.net,multithreading,asynchronous,webforms,C#,Asp.net,Multithreading,Asynchronous,Webforms,我有一个报告页面,它从数据库表构建报告。报告以表格格式显示。为了处理用户交互,我构建了一个JQuery表插件,它允许用户通过自定义排序、筛选和分页来自定义报表 JQuery插件使用一组ajax请求用数据填充表。这些ajax请求调用asp.net(c#)webMethods,后者反过来使用一组类来构建SQL并执行查询。生成的查询与WebMethod在同一线程中运行。这会导致问题,因为SQL可能需要超过30秒才能返回。我一直在读关于启动新线程和异步方法的书。我的问题是,我显然不想在整个SQL执行过程

我有一个报告页面,它从数据库表构建报告。报告以表格格式显示。为了处理用户交互,我构建了一个JQuery表插件,它允许用户通过自定义排序、筛选和分页来自定义报表

JQuery插件使用一组ajax请求用数据填充表。这些ajax请求调用asp.net(c#)webMethods,后者反过来使用一组类来构建SQL并执行查询。生成的查询与WebMethod在同一线程中运行。这会导致问题,因为SQL可能需要超过30秒才能返回。我一直在读关于启动新线程和异步方法的书。我的问题是,我显然不想在整个SQL执行过程中保留ASP.NET池中的线程,因为它只等待I/O

是否可以在等待SQL Server响应时将线程返回到线程池?这可以通过使用Begin和End ADO.net命令来实现吗

我问的原因是,目前这不是一个问题,但随着使用该系统的用户数量的增加,所有为新用户提供服务的线程池都将在运行这些长查询时饱和

这可以通过使用Begin和End ADO.net命令来实现吗


没错

不幸的是,如果WebMethod需要使用查询结果中的数据进行响应,那么您没有实际的选择。您真的希望1000多名用户同时运行同一个报表吗?如果答案是肯定的,并且报告的参数没有改变,为什么不暂时缓存结果呢?否则,您可能需要查看设计更改—提交“请求”以运行报告,运行SQL代理作业以将“请求”处理到结果表中,并让客户端查询方法以检查“请求”的状态。我不是专家,所以我只发表一条评论,以下是获取web方法部分asych的文档—我已经阅读了(怀疑)要使async正常工作,堆栈中的所有内容都需要支持async,否则就会达到同步运行并占用线程的级别。因此asych web方法应该调用asych ado.net命令。@MatthewMartin您仍然会看到线程池被“吃掉”。谢谢。我不太可能让1000多名用户同时运行一个报表,因为在这种情况下,SQL server可能是瓶颈。问题是表中可能包含超过2000万行的数据,因此缓存不可行。我可能必须考虑使用SQL代理作业创建一个临时结果表。@MatthewMartin t线程池中可用的线程因处理器和可用虚拟内存的不同而不同——1000数字并非来自特定的任何位置。是的,IIS确实可以进一步对此施加限制,但无论是否使用异步,如果WebMethod在生成结果之前不返回调用方,则将阻止请求(因此保留一个请求线程);async不能解决这个问题。在这种情况下,我看到的唯一选择是将报告的生成转移到其他地方,并让web浏览器轮询完成。