【问题标题】:Problem with Await in File Handle Asp.Net文件句柄 Asp.Net 中的等待问题
【发布时间】: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/…

标签: c# asp.net webforms


【解决方案1】:

我正在尝试使其异步运行,但效果不佳。下面的代码返回“StartSavedEnd”,这意味着等待不起作用,因为我的文件需要 10 秒才能上传。

await 不会使文件上传运行得更快,await doesn't return early from HTTP requests

为了使您的系统看起来更具响应性,您需要在后台在客户端进行上传,例如,使用 AJAX 等技术。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-26
    • 1970-01-01
    相关资源
    最近更新 更多