【发布时间】:2021-06-23 07:00:58
【问题描述】:
我创建了一个 Webform 应用程序,它允许用户在 Asp.Net 中使用 AJAX 和 FileHandle.ashx 上传文件 我正在尝试使其异步运行,但效果不佳。 下面的代码返回“StartSavedEnd”,这意味着等待不起作用,因为我的文件需要 10 秒才能上传。有什么建议吗?非常感谢
public override async Task ProcessRequestAsync(HttpContext context)
{
context.Response.ContentType = "text/plain";
context.Response.Write("Start");
await SaveFile(context);
context.Response.Write("End");
}
async Task SaveFile(HttpContext context)
{
var task = Task.Run(() =>
{
if (context.Request.Files.Count > 0)
{
HttpFileCollection files = context.Request.Files;
foreach (string key in files)
{
HttpPostedFile file = files[key];
string fileName = file.FileName;
fileName = context.Server.MapPath(fileName);
file.SaveAs(@"C:\TestZip.zip");
context.Response.Write("Saved");
}
}
});
await task;
}
【问题讨论】:
-
这能回答你的问题吗? ASP.NET Webforms with async/await
-
@GSerg 我已经查看了该线程,但 ConfigureAwait(false) 对我不起作用。顺便说一句,没有答案被接受为答案
-
尝试用 SaveFile(context).GetAwaiter().GetResult() 替换 await SaveFile(context)。 GetAwaiter/GetResult 不会在旧版 ASP.net 中创建死锁。 (不同于 ASP.net Core)
-
@GuyatMercator 当我添加 .GetAwaiter().GetResult() 时显示编译错误“无法等待 void”
-
为什么不简单地同步运行这段代码呢? TaskRun 将创建另一个线程,但您想等待其执行结束。所以同步执行似乎很适合。网络表单中的后台任务并非微不足道。看看这个:haacked.com/archive/2011/10/16/…