8

我从这个博客获得的 ASP.NET MVC 4 WEB API 控制器中有这个异步方法:http: //www.strathweb.com/2012/04/html5-drag-and-drop-asynchronous-multi-file-upload -with-asp-net-webapi/

  public async Task<IList<RecivedFile>> Post()
    {
        List<RecivedFile> result = new List<RecivedFile>();
        if (Request.Content.IsMimeMultipartContent())
        {
            try
            {
                MultipartFormDataStreamProvider stream = new MultipartFormDataStreamProvider(HostingEnvironment.MapPath("~/USER-UPLOADS"));

                IEnumerable<HttpContent> bodyparts = await Request.Content.ReadAsMultipartAsync(stream);
                IDictionary<string, string> bodyPartFiles = stream.BodyPartFileNames;
                IList<string> newFiles = new List<string>();

                foreach (var item in bodyPartFiles)
                {
                    var newName = string.Empty;
                    var file = new FileInfo(item.Value);

                    if (item.Key.Contains("\""))
                        newName = Path.Combine(file.Directory.ToString(), item.Key.Substring(1, item.Key.Length - 2));
                    else
                        newName = Path.Combine(file.Directory.ToString(), item.Key);

                    File.Move(file.FullName, newName);
                    newFiles.Add(newName);
                }

                var uploadedFiles = newFiles.Select(i =>
                {
                    var fi = new FileInfo(i);
                    return new RecivedFile(fi.Name, fi.FullName, fi.Length);
                }).ToList();

                result.AddRange(uploadedFiles);
            }
            catch (Exception e)
            {
            }
        }
        return result;
    }

我的问题是为什么这个方法的返回类型是 Task?尚不清楚它返回此任务的“去哪里”或“给谁”?就像没有人等待/接收返回的对象一样。

我想知道如果我像这样返回 void 会有什么影响:

编辑:

我已经尝试了下面的代码,它完全破坏了程序。就像运行时失去对代码的引用一样,代码本身并没有完成运行。

    public async void Post()
    {
        List<RecivedFile> result = new List<RecivedFile>();
        if (Request.Content.IsMimeMultipartContent())
        {
            try
            {
                MultipartFormDataStreamProvider stream = new MultipartFormDataStreamProvider(HostingEnvironment.MapPath("~/USER-UPLOADS"));

                IEnumerable<HttpContent> bodyparts = await Request.Content.ReadAsMultipartAsync(stream);
                IDictionary<string, string> bodyPartFiles = stream.BodyPartFileNames;
                IList<string> newFiles = new List<string>();

                foreach (var item in bodyPartFiles)
                {
                    var newName = string.Empty;
                    var file = new FileInfo(item.Value);

                    if (item.Key.Contains("\""))
                        newName = Path.Combine(file.Directory.ToString(), item.Key.Substring(1, item.Key.Length - 2));
                    else
                        newName = Path.Combine(file.Directory.ToString(), item.Key);

                    File.Move(file.FullName, newName);
                    newFiles.Add(newName);
                }

            }
            catch (Exception e)
            {
            }
        }

    }
4

3 回答 3

7

ASP.NET 运行时等待它。您可能会发现此视频很有用。

大多数示例async都假设一个 UI 上下文。ASP.NET也提供了一个上下文,但它是一个“请求”上下文——每个 HTTP 请求都有一个上下文。我的async/await帖子概述了这个“上下文”,而async/ awaitFAQ则更详细。

于 2012-08-11T15:24:21.947 回答
0

使用返回类型 void,您无需等待对象返回。您等待操作完成。你等待你的任务完成。

于 2012-08-11T13:35:20.157 回答
0

如果您返回 void,无论您的异步操作的完成状态如何,您都将立即返回 204“No Content”响应消息。这是在 的帮助下完成的VoidResultConverter

注意:在 RC 上,您会看到它返回 200“OK”响应,但使用 RTM,它将返回 204“No Content”响应。

于 2012-08-11T15:33:14.083 回答