【发布时间】:2017-11-20 14:02:42
【问题描述】:
我有两个网页。在一个页面中,我正在上传一些文件并处理需要大量时间才能完成的数据。在其他页面上,我只是在数据库中呈现数据。 我已经在 c# mvc 中实现了这个应用程序。 我的要求是,一旦用户上传文件,文件处理就会在后台开始,用户就可以浏览其他页面。
我们可以通过异步控制器来实现吗?
【问题讨论】:
标签: c# asp.net-mvc-4 asp.net-mvc-5
我有两个网页。在一个页面中,我正在上传一些文件并处理需要大量时间才能完成的数据。在其他页面上,我只是在数据库中呈现数据。 我已经在 c# mvc 中实现了这个应用程序。 我的要求是,一旦用户上传文件,文件处理就会在后台开始,用户就可以浏览其他页面。
我们可以通过异步控制器来实现吗?
【问题讨论】:
标签: c# asp.net-mvc-4 asp.net-mvc-5
您是说处理数据需要很多时间。使用异步控制器,您将释放 Web 服务器以服务其他请求,但是请求将在同步调用时完成的同时完成。 (来源:https://msdn.microsoft.com/en-us/library/ee728598%28v=vs.100%29.aspx)
如果您不希望您的用户等待,请将作业队列添加到您的堆栈中,告诉用户您已接受文件并正在处理它,并在操作完成时通知他。
.NET 中有许多可用的作业队列实现,具体建议取决于您是在“完整”.NET 还是 .NET Core 上运行。
【讨论】:
在这里使用异步控制器不会达到您想要的效果,尽管您仍应首先使用它们。异步控制器只会释放服务器线程以便可以处理更多请求,如果没有异步,任何长时间运行的操作都会阻塞它们正在使用的线程并停止处理其他请求。如果有足够长的运行线程,那么其他客户端请求将被拒绝。
您还(或相反)需要研究一种不同的机制来处理文件,例如 API 操作可以将文件放入文件夹中,而另一个(非 Web 服务)进程可以监视该文件夹并拿起要处理的新文件。或者,您可以查看队列或消息总线技术,这增加了复杂性,但也为您提供了队列处理的安全性。
要考虑的另一件事是如何将验证问题或错误报告回上传客户端,您可以在 API 操作中进行一些检查,但您可能仍需要考虑如何在处理过程中发生错误时通知客户端的一个文件。如何做到最好取决于您的系统。
【讨论】: