4

コントローラでAsync/Awaitを使用している場合、AsyncControllerから継承する必要がありますか、それともControllerを使用している場合は本当に非同期ではありませんか?Asp.net Web APIはどうですか?AsyncApiControllerはないと思います。現在、私はコントローラーとその動作を継承していますが、それは本当に非同期ですか?

4

2 に答える 2

6

AsyncControllerMVC4のクラスのXMLコメントは次のように述べています

ASP.NETMVC3との下位互換性のために提供されています。

クラス自体は空です。

言い換えれば、あなたはそれを必要としません。

于 2012-10-24T17:37:08.747 に答える
0

Web APIに関しては、非同期コントローラーの基本クラスは必要ありません。あなたがする必要があるのは、タスクで戻り値をラップすることだけです。

例えば、

    /// <summary>
    /// Assuming this function start a long run IO task
    /// </summary>
    public Task<string> WorkAsync(int input)
    {
        return Task.Factory.StartNew(() =>
            {
                // heavy duty here ...

                return "result";
            }
        );
    }

    // GET api/values/5
    public Task<string> Get(int id)
    {
        return WorkAsync(id).ContinueWith(
            task =>
            {
                // disclaimer: this is not the perfect way to process incomplete task
                if (task.IsCompleted)
                {
                    return string.Format("{0}-{1}", task.Result, id);
                }
                else
                {
                    throw new InvalidOperationException("not completed");
                }
            });
    }

さらに、.Net 4.5では、await-asyncを利用して、さらに単純なコードを記述できます。

    /// <summary>
    /// Assuming this function start a long run IO task
    /// </summary>
    public Task<string> WorkAsync(int input)
    {
        return Task.Factory.StartNew(() =>
            {
                // heavy duty here ...

                return "result";
            }
        );
    }

    // GET api/values/5
    public async Task<string> Get(int id)
    {
        var retval = await WorkAsync(id);

        return string.Format("{0}-{1}", retval, id);
    }
于 2012-10-24T20:30:57.203 に答える