実現したいこと
- C#からSQL Serverのストアドプロシージャを実行したい。
- その際、プロシージャの実行を非同期で行いたい。(プロシージャを実行を開始したら、C#側の処理は、結果を待たずに終了したい)
- 実現自体はできていますが、同期メソッドでは実現できるが、非同期メソッドでは実現できない理由がわかりません。
状況
- 下記の2つのコード
- 前者は想定通りの動きをします。(実現したいことが実現できるコード)
- 後者はconn.OpenAsync()の後の処理が実行されません。
- (cmd.ExecuteNonQuetyAsync()をブレークポイントに設定しても止まらない)
- もともとはメソッドに切り出さないで、Task.Runを使用せずに、awaitを使用した同期処理として実行できているコードでした。
うまくいくコード
C#
1string connInfo = "hoge"; 2string procedureName = "fuga"; 3using (SqlConnection connection = new SqlConnection(connInfo)) 4{ 5 SqlCommand command = new SqlCommand(procedureName, connection) 6 { 7 CommandType = CommandType.StoredProcedure, 8 CommandTimeout = timeOut 9 }; 10 //これより上は共通 11 Task task = Task.Run(() => CallProcedureAsync(connection, command)); 12} 13 14static void CallProcedureAsync(SqlConnection conn, SqlCommand cmd) 15{ 16 conn.Open(); 17 cmd.ExecuteNonQuery(); 18}
うまくいかないコード
C#
1string connInfo = "hoge"; 2string procedureName = "fuga"; 3using (SqlConnection connection = new SqlConnection(connInfo)) 4{ 5 SqlCommand command = new SqlCommand(procedureName, connection) 6 { 7 CommandType = CommandType.StoredProcedure, 8 CommandTimeout = timeOut 9 }; 10 //これより上は共通 11 Task task = Task.Run(async() => await CallProcedureAsync(connection, command)); 12} 13 14static async Task CallProcedureAsync(SqlConnection conn, SqlCommand cmd) 15{ 16 await conn.OpenAsync(); 17 await cmd.ExecuteNonQueryAsync(); 18}
知りたいこと
- 後者のコードがなぜ想定通り実行されないのでしょうか。
- asyncメソッドを非同期で実行するためには、どのような記述をすれば良いのでしょうか。
よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/03/18 09:58