コントローラでAsync/Awaitを使用している場合、AsyncControllerから継承する必要がありますか、それともControllerを使用している場合は本当に非同期ではありませんか?Asp.net Web APIはどうですか?AsyncApiControllerはないと思います。現在、私はコントローラーとその動作を継承していますが、それは本当に非同期ですか?
質問する
2314 次
2 に答える
6
AsyncController
MVC4のクラスの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 に答える