MDNチュートリアルのような.NET Async/Awaitの例には厳しい時間があります。.NET WebApi非同期コントローラのアクションが永遠に実行
私はコントローラのアクション非同期を作るために、集まったものから、私がしなければならない:
- は、メソッド名の前に
async
を追加します。 await
を追加すると、プライマリタスクが実行されます。- ストアまたはリポジトリから取得する場合は、
Task.Run()
をStoreメソッドに追加する必要があります。私は、コンパイラでエラーや警告がなく、この方法だけでハングアップ、それを行うとき async
方法はTask<>
を返す必要があります。どこが間違っていますか?
PostsController.cs
public async Task<IHttpActionResult> Get()
{
PostsStore store = new PostsStore();
List<Post> AsyncResult = await store.GetPosts();
return Ok(AsyncResult);
}
PostsStore.cs
public async Task<List<Post>> GetPosts()
{
List<Post> result = await Task.Run(() => {
List<Post> posts = new List<Post>();
string conn = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;
using (SqlConnection connection = new SqlConnection(conn))
{
SqlCommand command = new SqlCommand();
command.Connection = connection;
command.CommandText = "GetPosts";
command.CommandType = System.Data.CommandType.StoredProcedure;
connection.Open();
SqlDataReader dr = command.ExecuteReader();
while (dr.Read())
{
Post post = new Post()
{
PostId = (int)(dr["PostId"]),
Title = dr.SafeGetString("Title"),
Body = dr.SafeGetString("Body"),
SaveTitle = dr.SafeGetString("SaveTitle"),
SaveBody = dr.SafeGetString("SaveBody"),
Slug = dr.SafeGetString("Slug"),
State = dr.SafeGetString("State"),
IsPublished = (bool)(dr["IsPublished"]),
LastSaved = (DateTime)(dr["LastSaved"]),
CreateDate = (DateTime)(dr["CreateDate"])
};
posts.Add(post);
}
dr.Close();
connection.Close();
return posts;
}
});
return result;
}
Task.Runの必要はありません。また、usingステートメントでラップされているときに閉じる必要はありません。 – mason