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公开。如果可行,有人可以提供一些伪代码来说明如何在不阻止应用的情况下工作吗?
答
如果这是可行的,有人可以提供一些伪代码,它可以在不阻止应用程序的情况下工作吗?
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关联的缓存中即可。
如果你想得到花式裤子,你可以使用像微软奥尔良或阿卡这样的东西来做处理。
通过“做东西与它”你的意思是用户会看到,或者它只是更新后端或什么? –
只是后端。其实只是把东西放入分贝。没有数据返回浏览器。后来这个东西会从db中调用并在另一个进程中使用。 – Robert