8

このブログから取得したASP.NETMVC4 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;
    }

私の質問は、なぜこのメソッドがタスクのリターンタイプを持っているのかということです。このタスクを「どこに」または「誰に」返すかは明確ではありませんか?返されたオブジェクトを待ったり受け取ったりする人がいないようなものです。

このように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リクエストごとに1つです。私のasync/await投稿はこの「コンテキスト」の概要を示しており、async/ awaitFAQはさらに詳細に説明されています。

于 2012-08-11T15:24:21.947 に答える
0

return type voidを使用すると、オブジェクトが戻るのを待つ必要はありません。操作が終了するのを待ちます。タスクが終了するのを待ちます。

于 2012-08-11T13:35:20.157 に答える
0

voidを返すと、非同期操作の完了ステータスに関係なく、204「コンテンツなし」応答メッセージがすぐに返されます。これは、の助けを借りて行われますVoidResultConverter

注:RCでは、200個の「OK」応答が返されますが、RTMでは、204個の「コンテンツなし」応答が返されます。

于 2012-08-11T15:33:14.083 に答える