【问题标题】:Long blocking while loop in ASP.NET MVC Web API applicationASP.NET MVC Web API 应用程序中的长阻塞 while 循环
【发布时间】:2016-09-26 23:52:03
【问题描述】:

第三方产品供应商给了我一个任务的 Perl 脚本实现。我的工作是将它翻译成我的 ASP.NET MVC5 Web 应用程序。

perl 脚本的一个组成部分是一个包含以下内容的 while 循环:

    ### Only run this task every second, that's plenty
    sleep 1;

基本上他们以 1 秒的间隔在 while 循环中做事(伪代码):

    While (condition)
    {
        -go get an m3u8 playlist file from the web
        -parse it line by line
        -look for a particular thing in it
        -If you find it, break out of this loop and do stuff with it
    }

通常需要 20-30 次尝试(20-30 秒)才能找到。

这是一种带有 async 和 await 的异步编程面向的东西,还是 Web 应用程序中不应该有的东西?

该过程将通过对 Web API 的 ajax 调用公开。如果可行,有人可以提供一些伪代码来说明它如何在不阻止应用程序的情况下工作吗?

【问题讨论】:

  • “用它做事”是指用户会看到,还是它只是更新后端之类的?
  • 只是后端。实际上只是将东西放入数据库中。没有数据返回浏览器。稍后将从数据库中调用该事物并在另一个进程中使用。

标签: c# asp.net-mvc asp.net-web-api async-await


【解决方案1】:

如果可行,有人可以提供一些伪代码来说明它如何在不阻止应用程序的情况下工作吗?

AJAX 调用始终是非阻塞的。为此,您无需在服务器端执行任何特殊操作。

我建议使用async/await,这样您就不会用完休眠的 ASP.NET 线程:

public async Task<MyResult> GetThing()
{
  While (condition)
  {
    -go get an m3u8 playlist file from the web
    -parse it line by line
    -look for a particular thing in it
    -If you find it, break out of this loop and do stuff with it
    await Task.Delay(TimeSpan.FromSeconds(1));
  }
}

但请注意,async 仅用于释放 ASP.NET 服务器端的线程。它对客户端没有任何影响。客户端进行 AJAX 调用,并异步处理完成,而不考虑服务器的实现。

【讨论】:

    【解决方案2】:

    您可以使用 async/await,但更多的是关于同步异步行为。你的问题有点不同,你有一个长时间运行的进程,你不能阻止它,所以你需要一种方法来触发它开始,提供更新,然后处理完成。您可以为此使用 signalR 之类的东西

    如果您想为此使用 ajax,那么您的 API 之类的...

    StartJob()    -> return GUID
    JobStatus(guid)   ->  either, InProgress ( % complete if you can), Final Result, or Error
    

    然后是客户端,启动它,然后轮询状态直到完成。

    在实现方面,您只需启动一个任务并将其存储在与 GUID 关联的缓存中。

    如果你想得到花哨的裤子,你可以使用 Microsoft Orleans 或 Akka 之类的东西来进行处理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-15
      • 1970-01-01
      • 1970-01-01
      • 2016-04-21
      • 1970-01-01
      相关资源
      最近更新 更多