簡體   English   中英

ASP.NET MVC Web API應用程序中的長時間阻塞循環

[英]Long blocking while loop in ASP.NET MVC Web API application

第三方產品供應商已為我提供了任務的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調用公開。 如果可行,有人可以在不阻止應用程序的情況下提供一些偽代碼,說明其如何工作嗎?

您可以使用async / await,但這更多的是關於同步異步行為。 您的問題有所不同,您有一個長期運行的流程,無法阻止,因此您需要一種方法來觸發它開始,提供更新並處理完成。 您可以為此使用諸如signalR之類的東西

如果您想為此使用ajax,則類似於您的API ...

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

然后是客戶端,啟動它,然后輪詢狀態直到完成。

在實現方面,您只需啟動任務並將其存儲在與GUID相關聯的緩存中。

如果您想要花哨的褲子,可以使用Microsoft Orleans或Akka之類的方法進行處理。

如果可行,有人可以在不阻止應用程序的情況下提供一些偽代碼,說明其如何工作嗎?

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調用,並異步處理完成,而與服務器的實現無關。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM