【发布时间】:2016-04-15 14:34:29
【问题描述】:
我是 C# 的整个 async/await 部分的新手,而且我已经把头撞到墙上将近一整天了。
我正在将文件从我的网页上传到另一个应用程序。当他们收到这个文件时,他们将开始执行它包含的一些指令(这工作正常)。 但是,如果将文件发送到他们的服务器后,我会调用他们的另一个方法,该方法将返回执行进度。
我在这里面临的问题是 GetProgress() 方法只会在 UploadFile() 方法完成后返回,此时进度将始终为 100%。
这些是我目前正在使用的方法:
public class FileUpload : IHttpHandler
{
public async void ProcessRequest(HttpContext context)
{
HttpPostedFile uploadedfile = context.Request.Files[0];
string FileName = uploadedfile.FileName;
string FileType = uploadedfile.ContentType;
int FileSize = uploadedfile.ContentLength;
await UploadFile(uploadedfile.InputStream);
GetProgress();
}
public async Task<HttpResponseMessage> UploadFile(Stream stream1)
{
HttpResponseMessage task = null;
try
{
_importOperationId = Guid.NewGuid().ToString();
using (var fileStreamContent = new StreamContent(stream1))
using (var client = new HttpClient())
{
using (var formData = new MultipartFormDataContent())
{
client.Timeout = new TimeSpan(0, 1, 0, 0);
formData.Add(fileStreamContent, _importOperationId, _importOperationId + ".xml");
task = await client.PostAsync(systemDataServiceUrl + resource + _importOperationId, formData);
}
}
}
catch (Exception exc)
{
Logging.AddErrorLogItem(exc, _importOperationId, "Import.aspx");
}
return task;
}
}
和前端部分:
<form id="file_upload" >
<input id="fileupload" type="file" name="files[]" data-url="FileUpload.ashx" multiple>
<script src="../Scripts/jquery.ui.widget.js"></script>
<script src="../Scripts/jquery.iframe-transport.js"></script>
<script src="../Scripts/jquery.fileupload.js"></script>
<script type="text/javascript">
/*global $ */
$(function () {
$('#fileupload').fileupload({
dataType: 'json',
done: function (e, data) {
$.each(data.result.files, function (index, file) {
$('<p/>').text(file.name).appendTo(document.body);
});
}
});
});
</script>
任何帮助都将不胜感激,出于某种原因,我似乎无法掌握 async/await 的工作原理,即使我对 AJAX 非常熟悉。
【问题讨论】:
-
await在那里停止您的方法并返回。该方法将在调用返回之后继续。您想存储任务以备将来结果,但不等待它。 -
类似的东西?
var uploadedFile= UploadFile(uploadedfile.InputStream); -
@DVM 我认为这也不能解决您的问题 - 我认为您对 async/await 的作用或用途存在根本性的误解。所有 await 所做的只是暂停该方法,直到它准备好继续(释放资源 - 通常是线程 - 用于其他东西......在 Web 编程上下文中的其他请求)。听起来
GetProgress应该是一个单独的轮询请求。 -
您可以将代码放入 BackgroundWorker 中,以便在等待服务器响应时报告进度。
标签: c# async-await