質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

1回答

7217閲覧

この非同期処理はなぜ動かないのでしょうか?

HelloWorld2

総合スコア32

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2019/03/18 08:14

実現したいこと

  • 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メソッドを非同期で実行するためには、どのような記述をすれば良いのでしょうか。

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Task task = Task.Run(async() => await CallProcedureAsync(connection, command));
ここでTaskの終了を待たずに using を抜けてしまってますので、connectionが破棄されます。
await CallProcedureAsync(connection, command);
のように待つ必要があります。

投稿2019/03/18 09:23

編集2019/03/18 09:25
hihijiji

総合スコア4150

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

HelloWorld2

2019/03/18 09:58

おっしゃる通りでした。 connection生成から別メソッドで実行したらうまくいきました。 asyncとか同期メソッドとか関係なさそうでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問