ASP中的长阻塞while循环.NET MVC Web API应用程序

本文关键字:MVC NET Web API 应用程序 循环 while ASP | 更新日期: 2023-09-27 18:08:51

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

perl脚本的一个组件是一个while循环,其中包含以下内容:

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

基本上它们在一个while循环中每隔1秒做一些事情(伪代码):

    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应用程序?

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

ASP中的长阻塞while循环.NET MVC Web API应用程序

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

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调用,并异步处理完成,而不考虑服务器的实现。

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

如果你想使用ajax,那么像你的API…

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

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

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

如果你想要花哨的裤子,你可以使用像Microsoft Orleans或Akka这样的东西来做处理。