2015-10-14 58 views
1

我在新線程中上傳文件,但看起來像服務器正在同一主線程中。 (使用ASP.NET MVC)文件上傳未在Web服務器的後臺線程中運行

本地文件上傳需要3秒,但在實時web服務器上,需要20秒完成方法,這僅僅是因爲文件上傳。 我無法理解它是在後臺線程中,爲什麼它會增加返回時間。

在實時Web服務器我使用IIS 8 以下是代碼

 string path = string.Empty; 
     string thumbPath = string.Empty; 
     HttpContext cont = HttpContext.Current; 
     string url = HttpContext.Current.Request.Url.Host.ToLower(); 
     Thread t1= new Thread(() => 
     { 
      if (files.Count() > 0 || files != null) 
      { 
       foreach (HttpPostedFileBase file in files) 
       { 
        if (file != null) 
        { 
         string newFileName = System.Guid.NewGuid().ToString("N"); 
         Photo photo = new Photo(); 
         path = UploadFile(cont, file, ad.Id.ToString(), newFileName); 
//Create thumbnail 
         thumbPath = CreateAdThumbNail(cont, file, ad.Id.ToString(), newFileName); 
        } 
       } 
      } 
     }); 
     t1.IsBackground = true; 
     t1.Start(); 

     string[] message = new string[2]; 
     message[0] = "true"; 
     message[1] = "http://" + HttpContext.Current.Request.Url.Host.ToLower() + "/Ad/Item/" + "?section=myads"; 
     return Json(message, JsonRequestBehavior.AllowGet); 

End Result Time with and without adding image]

+0

如果您的上傳需要20秒,您會非常接近請求超時,這是30秒。您可能想要通過AJAX查看上傳塊,例如與plupload。 – LocEngineer

回答

1

我認爲你期待您上傳到服務器,另一個線程發生,且不會因爲它執行實際的HTTP請求並將數據發送到您的服務器。我認爲這是花費時間的上傳,而不是新線程中的邏輯,HTTP請求的速度取決於服務器和上傳方之間的連接速度以及服務器可以存儲信息。

您在附加線程中所做的只是已發送到服務器的文件的最終處理 - 將其移至文件系統的其他位置並創建上載映像的縮略圖。當你創建新的線程時,該文件已經被髮送到服務器。

如果您還沒有這樣做,我建議使用AJAX請求發送上傳請求,該請求將在「幕後」異步執行,並且不會讓用戶查看凍結的屏幕,而上傳20秒發生。

問題是,Ajax上傳需要一個iFrame和各種奇特的技巧,以確保它與所有瀏覽器兼容。 http://malsup.com/jquery/form/

我使用的方法是使用ajaxSubmit()其提交表單:除非你想,但我用下面的插件都在我的網站上上傳的,它就像一個魅力我不會理會這樣做自己AJAX以及任何<input type="file" />字段。

+0

我明白了你的意思,你可以引用一些ajax的例子,你如何讓我執行這個? 我的文件上傳與以前的呼叫主鍵連接,上傳後它發送更新呼叫到數據庫以及 – Diana

+0

偉大的東西。我在我的答案中包含了一些額外的信息。我希望它有幫助。該網站上有很多代碼示例。如果你還沒有,你需要在你的頁面中包含jQuery。 – Luke

+0

我想給你+100,但只有+1是可能的 我沒有使用你的代碼,但得到你的答案 而我的表單提交後,我用ajax異步調用來上傳文件。 感謝您節省我的一天。 – Diana