2012-07-09 11 views
1

我有3-4個相關的問題。如何讓多個用戶同時執行冗長的mvc3操作並且響應時間很短?

  1. 如果行數X採用同步上傳方法,那麼: -

    一個。來自同一用戶(同一會話)的另一個請求將如何處理: -

    • 與_UploadStatement不同的操作方法? - 它會排隊或同時服務?

    • 相同的操作方法,即_UploadStatement? - 它會被放入隊列或同時服務?

    b。來自不同用戶(不同會話)的另一個請求將如何被服務: -

    • 不同於_UploadStatement的操作方法? - 它會排隊或同時服務?

    • 相同的操作方法,即_UploadStatement? - 它會被放入隊列或同時服務?

如果它們被放入隊列,那麼這意味着未來用戶將不得不等待,直到第一個用戶的上傳完成?

public class AbcController : Controller 
{ 
    public ActionResult A1() 
    { 
    return view(); 
    } 

    public JsonResult _UploadStatement(HttpPostedFileBase UploadedStatement) 
    { 
    // Some web service uploading a lengthy file received to other server (say amazon s3 storage):- 
    // LINE NUMBER - X 
    } 
} 

回答

2

這些行動將並行發生。每次IIS收到新請求時,它都會創建一個新控制器,並在新控制器實例上執行該操作。但是,每個控制器將使用不同的線程執行請求。

只有當你有過這樣將用戶B的代碼必須等待,直到用戶A結束了他上傳:

public class AbcController : Controller 
{ 
    private static readonly object Lock = new object(); 

    public ActionResult A1() 
    { 
    return view(); 
    } 

    public JsonResult _UploadStatement(HttpPostedFileBase UploadedStatement) 
    { 
    lock (Lock) 
    { 
     // Some web service uploading a lengthy file received to other server (say amazon s3 storage):- 
     // LINE NUMBER - X 
    } 
    } 
} 

這樣的鎖會告訴線程「哎,我們當中只有一個是允許執行方法,現在我已經鎖定了方法,你必須等到我完成之後,當我完成之後,我會給你鎖定,然後你可以執行這個方法,讓其他人等待你完成。

操作方法不知道或關心請求來自誰。如果用戶A提交了3次上傳,IIS將使用不同的線程並行執行它們。但是,它可能不會以與請求相同的順序返回結果。例如,第二個請求可以先完成,然後是第三個,最後是第一個。

雖然線程不足,但會發生什麼情況。假設你有50個用戶,每個用戶同時上傳3個文件。這意味着至少有150個線程將從池中取出,這可能會導致應用程序的其他部分響應速度更慢。您可以從AsyncController中查看擴展,以幫助處理由於線程阻塞導致I/O限制嚴重或潛在潛伏的任務的線程不足情況。

+0

此行爲是否與Visual Studio Development Server不同?因爲我在VS Web Server中看到了不同的結果。 – teenup 2012-07-09 20:32:55

+0

針對IIS Express開發,而不是「cassini」開發服務器。 IIS將更緊密地匹配生產中發生的情況。我不能說卡西尼是否使用1個線程來處理所有請求,所以我將不得不推遲。但知道我對卡西尼的瞭解,這不是不可能的。 – danludwig 2012-07-09 20:34:02

+0

發生什麼事情是,如果我上傳了一個很重的文件,說10MB,點擊提交,瀏覽器的加載圖標旋轉,這意味着請求正在處理,但同時,如果我嘗試訪問另一個動作,通過在瀏覽器中輸入URL,屏幕只有在上傳完成後纔會顯示。 - 這是什麼 - 這意味着請求已被放入隊列中。 – teenup 2012-07-09 20:37:23

相關問題