【发布时间】:2016-01-20 00:05:02
【问题描述】:
我有一个现有的大型 ASP.NET(ASP.NET Web 窗体 + MVC 支持)应用程序并尝试在项目上实现 async 编程。
为此,我通过选择 ASP.NET 应用程序(再次支持 ASP.NET Web 窗体 + MVC)创建了一个全新的 POC。我的 POC 运行良好,可以正确执行 async。
现在,当我在现有大型项目中复制完全相同的代码时,其行为类似于 synchronous。我已经在大型应用程序中获得了最新的 .NET Framework 更新。
这是我的Controller 实现,它应该上传文件async:
[HttpPost]
[ValidateInput(false)]
public async Task<JsonResult> VideoUpload(string Id)
{
for (int i = 0; i < Request.Files.Count; i++)
{
// :::::
await Run(fileStream);
}
return Json(new { error = false, message = "File uploaded." });
}
public async Task Run(Stream fileStream)
{
// :::::
using (fileStream)
{
// A long running method call
await fileUploadRequest.UploadAsync();
}
}
[HttpGet]
public JsonResult GetUploadingStatus()
{
// :::::
return Json(new { statusMessage = statusMessage, totalSent = totalSent, totalSize = totalSize }, JsonRequestBehavior.AllowGet);
}
在上面的代码中GetUploadingStatus() 是一个GET 方法可以快速完成工作。此方法接收随机(3-4 秒间隔)Ajax 调用并返回上传状态。
当我在大型项目中调试此实现时,我注意到 GetUploadingStatus() 在 fileUploadRequest.UploadAsync() 结束后一次返回每个结果(10-15 Json 响应)。所以我觉得这在大型项目中表现得像synchronous。那么为什么这在干净的项目中效果很好,但在大型项目中却不行呢?
【问题讨论】:
-
你的实际项目和POC配置是一样的吗?包括环境配置、web配置、会话等?
-
我认为您错误地将“异步编程”与“并行编程”混为一谈。异步的要点是将等待线程释放到线程池,而异步 I/O 操作等待结果。异步不会提高单个请求的应用程序性能,但它可以允许同时处理更多请求
-
谢谢南迪普。即使在实际项目中,我的实现也非常干净。我只想启用异步行为,我认为环境配置或 web.config 或会话不会发挥任何作用。即使我看不到任何错误。
-
Alex Art: async 是将等待线程释放到线程池,而异步 I/O 操作等待结果?异步和异步有什么区别?
-
你的逻辑毫无意义。 Ajax 调用是单独的 http 请求。他们与之前或之后的任何其他呼叫都没有关系。因此,异步或同步在这方面毫无意义,因为它们实际上是不同的请求。我会看看你如何锁定你用来在请求之间通信/存储进度的任何东西。
标签: c# asp.net asp.net-mvc asynchronous async-await