我在新线程中上传文件,但看起来像服务器正在同一个主线程中。 (使用ASP.NET MVC)
在本地,文件上传需要3秒,但在实时网络服务器上,完成方法需要20秒,这只是因为文件上传。 我无法理解它是在后台线程中然后为什么在返回时增加时间。
在实时网络服务器上,我使用的是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);
答案 0 :(得分:1)
我认为您希望上传到服务器的行为发生在另一个线程中,但不会因为它正在执行实际的HTTP请求并将数据发送到您的服务器。我假设上传是花费时间而不是新线程中的逻辑,HTTP请求的速度取决于服务器和上传方之间的连接速度以及服务器可以存储的速度信息。
您在附加线程中所做的只是对已发送到服务器的文件的最终处理 - 将其移动到文件系统上的其他位置并创建上载图像的缩略图。当您创建新线程时,该文件已经发送到服务器。
如果您还没有这样做,我建议使用AJAX请求发送上传请求,该请求将在“幕后”异步执行,并且不会让用户看到冻结的屏幕,同时上传20秒的地方。
问题是Ajax上传需要iFrame
和各种奇特的技术,以确保它与所有浏览器兼容。除非您愿意,否则我自己也不会费心去做,但我在我的网站上使用以下插件进行所有上传,它就像一个魅力:http://malsup.com/jquery/form/
我使用的方法是ajaxSubmit()
,它使用AJAX以及任何<input type="file" />
字段提交表单。