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

问题描述:

我已经为第三方产品供应商提供了Perl脚本实现的任务。我的工作是将其翻译成我的ASP.NET MVC5 Web应用程序。ASP.NET MVC Web API应用程序中的长时间阻塞while循环

一个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秒)才能找到。

这是异步编程与异步和await是面向或这是一个应用程序中不应该有的东西吗?

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

+0

通过“做东西与它”你的意思是用户会看到,或者它只是更新后端或什么? –

+0

只是后端。其实只是把东西放入分贝。没有数据返回浏览器。后来这个东西会从db中调用并在另一个进程中使用。 – Robert

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

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关联的缓存中即可。

如果你想得到花式裤子,你可以使用像微软奥尔良或阿卡这样的东西来做处理。