【问题标题】:Asynchronous controller异步控制器
【发布时间】:2017-11-20 14:02:42
【问题描述】:

我有两个网页。在一个页面中,我正在上传一些文件并处理需要大量时间才能完成的数据。在其他页面上,我只是在数据库中呈现数据。 我已经在 c# mvc 中实现了这个应用程序。 我的要求是,一旦用户上传文件,文件处理就会在后台开始,用户就可以浏览其他页面。

我们可以通过异步控制器来实现吗?

【问题讨论】:

    标签: c# asp.net-mvc-4 asp.net-mvc-5


    【解决方案1】:

    您是说处理数据需要很多时间。使用异步控制器,您将释放 Web 服务器以服务其他请求,但是请求将在同步调用时完成的同时完成。 (来源:https://msdn.microsoft.com/en-us/library/ee728598%28v=vs.100%29.aspx

    如果您不希望您的用户等待,请将作业队列添加到您的堆栈中,告诉用户您已接受文件并正在处理它,并在操作完成时通知他。

    .NET 中有许多可用的作业队列实现,具体建议取决于您是在“完整”.NET 还是 .NET Core 上运行。

    【讨论】:

    • 在通过异步控制器实现处理请求的同时,用户能否导航其他页面?我对此有疑问。根据我的理解,如果用户将导航到其他页面,那么它将到达其他控制器的另一个操作方法,因此处理将从异步控制器停止。
    • 正确。异步控制器无法完成您想要做的事情。某种类型的作业队列是一种选择,或者马特上面写的关于让另一个服务检查文件夹/数据库和进程的内容,这实际上是一种作业队列。
    【解决方案2】:

    在这里使用异步控制器不会达到您想要的效果,尽管您仍应首先使用它们。异步控制器只会释放服务器线程以便可以处理更多请求,如果没有异步,任何长时间运行的操作都会阻塞它们正在使用的线程并停止处理其他请求。如果有足够长的运行线程,那么其他客户端请求将被拒绝。

    您还(或相反)需要研究一种不同的机制来处理文件,例如 API 操作可以将文件放入文件夹中,而另一个(非 Web 服务)进程可以监视该文件夹并拿起要处理的新文件。或者,您可以查看队列或消息总线技术,这增加了复杂性,但也为您提供了队列处理的安全性。

    要考虑的另一件事是如何将验证问题或错误报告回上传客户端,您可以在 API 操作中进行一些检查,但您可能仍需要考虑如何在处理过程中发生错误时通知客户端的一个文件。如何做到最好取决于您的系统。

    【讨论】:

    • 是的,你是对的,我可以使用另一个非 Web 服务来进一步处理。但如果可能的话,我正在寻找任何其他选择。如果您可以在 dot net mvc 的同一个 Web 项目中建议任何其他实现,请告诉我。另外,要回答您的问题,我将如何通知用户错误是我正在向用户发送邮件以防错误和成功
    猜你喜欢
    • 2012-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-04
    • 1970-01-01
    • 2017-05-19
    • 2021-05-11
    • 2013-06-10
    相关资源
    最近更新 更多