如何处理单个异步操作的适当场景?例如,我需要导入大文件,并在导入过程中禁用该选项,以确保不会触发第二个导入。
首先想到的是:
[HttpPost]
public async Task<HttpResponseMessage> ImportConfigurationData()
{
if (HttpContext.Current.Application["ImportConfigurationDataInProcess"] as bool? ?? false)
return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "Task still running");
HttpContext.Current.Application["ImportConfigurationDataInProcess"] = true;
string root = HttpContext.Current.Server.MapPath("~/App_Data");
var provider = new MultipartFormDataStreamProvider(root);
await Request.Content.ReadAsMultipartAsync(provider);
//actual import
HttpContext.Current.Application["ImportConfigurationDataInProcess"] = false;
Request.CreateResponse(HttpStatusCode.OK, true)
}
但这似乎是一种非常硬编码的解决方案。如何正确处理呢?
另一件事是,它在客户端上工作不够正常,因为它仍在等待响应。所以用户是否可以只将该文件发送到服务器而不等待其完成,而是在文件发送到服务器后重新加载页面,而不必等待 await
的内容完成。
async
不会改变HTTP协议。如果你正在使用HTTP,那么每个请求只能得到一个响应。因此,如果你想在导入完成之前向客户端返回响应,那么你需要一个更复杂的解决方案。Azure只是可靠存储的一个例子;你不必使用Azure来解决这个问题。 - Stephen Cleary