2015-10-14 59 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