2016-09-26 67 views
0

我已經爲第三方產品供應商提供了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

回答

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調用,並異步處理完成。

1

你可以使用async/await,但那更多關於同步異步行爲。你的問題有點不同,你有一個你無法阻止的長時間運行的進程,所以你需要一種方法來觸發它啓動,提供更新,然後處理完成。你可以使用像signalR此

如果你想使用Ajax對於這一點,然後像你的API ...

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

然後客戶端,啓動它,然後輪詢狀態,直到完成。

執行方面,您只需啓動任務並將其存儲在與GUID關聯的緩存中即可。

如果你想得到花式褲子,你可以使用像微軟奧爾良或阿卡這樣的東西來做處理。