Asp.net mvc 我应该将我的操作方法转换为异步操作方法吗?

Asp.net mvc 我应该将我的操作方法转换为异步操作方法吗?,asp.net-mvc,asynchronous,iis-7.5,Asp.net Mvc,Asynchronous,Iis 7.5,我有一个网站,用户可以上传PDF并将其转换为WORD文档 它工作得很好,但有时(每小时5-6次)用户必须比平时等待更多的时间才能进行转换 我使用ASP.NET MVC,流程为: -用户上传文件->获取流并将其转换为word->将word文件另存为临时文件->返回用户url 我不确定是否必须将此流转换为?基本上,我的流程现在是顺序的,但我每秒有3-5个请求,CPU是双核和4GB Ram 据我所知,maxConcurrentRequestsPerCPU是5000;另外每个处理器线程的默认值限制为25

我有一个网站,用户可以上传PDF并将其转换为WORD文档

它工作得很好,但有时(每小时5-6次)用户必须比平时等待更多的时间才能进行转换

我使用ASP.NET MVC,流程为: -用户上传文件->获取流并将其转换为word->word文件另存为临时文件->返回用户url

我不确定是否必须将此流转换为?基本上,我的流程现在是顺序的,但我每秒有3-5个请求,CPU是双核和4GB Ram

据我所知,maxConcurrentRequestsPerCPU是5000;另外
每个处理器线程的默认值限制为25
;所以这些默认设置应该很好,对吧

那为什么我的web应用程序有时仍然有“等待”?是否有任何IIS设置需要从默认设置修改为其他设置,或者我应该直接将转换的同步方法设置为异步

Ps:转换本身需要1秒到40-50秒,这取决于pdf文件的大小


更新:基本上,我不太清楚的是:如果用户上传了一个文件,并且转换时间很长,那么当前的请求不应该因此而“受损”吗?因为下一个请求是独立的,所以进行另一个CPU调用和不同的线程,所以这里不应该等待,不是吗?

这里有一些事情必须明确定义。至少据我所知,异步(异步)方法和流不是一回事

异步方法(使用Task,通常还利用async/await关键字)将按以下方式工作:

  • 执行从线程t1开始,直到到达等待状态
  • (可能)长操作不会发生在线程t1上——有时甚至根本不会发生在应用程序线程上,利用IOCP(I/O完成端口)
  • 线程t1是空闲的,释放回线程池,并准备在需要时为其他请求提供服务
  • 当(可能的)长操作返回时,从线程池中获取一个线程(甚至可能是同一个t1,或者很可能是另一个t1),其余代码执行从上次遇到的等待恢复
  • 代码的其余部分将执行
  • 这里有几点需要注意:

    a。客户端在整个过程中被阻塞。线程等的最终切换只在服务器上发生 B这种方法主要是为了缓解一种称为“线程饥饿”的不必要情况。这并不意味着要加快客户端的总等待时间,通常也不会加快进程

    据我所知,异步流意味着,至少在这种情况下,在用户请求转换文档后,客户端(即客户端的浏览器)将快速收到一个响应,在该响应中,他被告知服务器上已经开始了这个可能很长的过程,用户应该有耐心,当前的响应页面可能会提供进度反馈


    在您的情况下,我推荐第二种方法,因为第一种方法根本没有帮助

    当然,这并不容易。您需要模拟队列,需要有一个处理代理和一个逐出策略(如果不需要第二个代理,很可能由同一个代理强制执行)

    这将按照以下思路进行:

    a。最终用户提交一个文件,web服务器接收它 Bweb服务器将其放入队列并接收作业编号 Cweb服务器向用户返回一个带有作业编号的响应(比如一个带有轮询机制的HTML页面,该机制将定期从服务器接收进度) D代理将在有机会(即完成其他工作)时开始处理文档,并在公共位置更新其状态,以便web服务器选择此信息 Eweb服务器将接收来自HTML响应的呼叫,询问作业的状态,并将发现作业已完成,并提供下载链接或直接开始下载

    这可以通过某些方式加以改进:

  • 可以使用长轮询(例如,覆盖两者)代替客户端轮询服务器
  • 如果硬件配置合理,可以使用多个处理代理,而不是一个


  • Remus Rușanu拥有一个简单的RDBMS,可以实现队列。

    转换CPU受限吗?如果是,异步没有帮助。CPU用于转换,I/O用于将结果写入文件…但写入时间并不特别长?写入速度非常快,例如转换为36秒,写入0秒。