2016-09-21 6 views
1

先日、このコードがASP.NETアプリケーションで検出されました。保存されたProcsを並行して呼び出す - その価値は?

var task1 = Task.Run(() => CallStoredProc1()); 
var task2 = Task.Run(() => CallStoredProc2()); 
... 
var task8 = Task.Run(() => CallStoredProc8()); 
Task.WaitAll(task1, task2, ..., task8); 

これらの8個のストアドプロシージャは、すべて同じSQL Serverデータベース上の単純なクエリです。

この場合、8個のストアド・プロシージャ・コールを呼び出すことは無視できるほど節約できますか?そうでない場合は、この反パターンの正しい名前に関する提案はありますか?

+3

私は実際にはそれぞれのストアドプロシージャが実際に何をしているかに依存していると言います。 – Igor

+2

このパターンは、WebサーバーとSQL Server間の待ち時間のために浪費される時間を削減することで、パフォーマンスを向上させるのに役立ちます。これは、通常、タスク並列ライブラリを使用するオーバーヘッドよりもはるかに大きくなります。 –

+0

それは可能性があります、SQLサーバーは並列処理を行うことができますので、潜在的な時間の節約。 –

答えて

0

いいえ、それは価値がありません。

SQLデータベースプロシージャを実行するだけのスレッドはスレッドリソースの無駄です。

実際には、var task1 = Task.Run(() => CallStoredProc1());行に作成されたスレッドは何も役に立ちません。データベースからの応答のみを待機します。

代わりにADO.NETという非同期メソッドを使用し、メソッドCallStoredProc1()CallStoredProc2()を非同期にします。その後、両方の手順は、データベースに送信されます。このように、あなたのASP.NETアプリケーション

Task proc1 = CallStoredProc1Async(); 
Task proc2 = CallStoredProc2Async(); 

await Task.WhenAll(proc1, proc2); 

でそれらを使用し、現在のスレッドが解放されます応答を待っている間に(スレッドプールに返す)ことができます。タスクが完了すると、スレッドプールからの別のスレッドが実行を継続します。

public async Task CallStoredProc1() 
{ 
    using(var conn = new Connection("yourConnectionString")) 
    { 
     using(var command = new SqlCommand("Procedure1", conn)) 
     { 
      CommandType = CommandType.StoredProcedure; 
      await conn.OpenAsync(); 
      await command.ExecuteNonQueryAsync(); 
     } 
    } 
} 
+1

タスク!=スレッド。 –

+1

@UweKeim、私は 'Task = Thread'とは言いませんでしたが、OPのケースでは' var task = Task.Run(...) 'は新しいスレッドです。 – Fabio

関連する問題