2016-06-20 6 views
0

私はユーザー応答クラスを構築するいくつかの関数を持っていますが、まだTASK非同期待機を把握しています。複数の呼び出しを同時に実行する方法

以下のコードから、一度に1つずつではなくすべてをすべて並列で実行する方法がありますか?

私の最初の質問は、今のところどのように設定されているのでしょうか?

私の2番目の質問は、これらの呼び出しをすべて並行して実行する方法です。リターンがどのようにコールが行われ、それが今に設定されている方法を取っている任意の特定の順序

public static async Task<ProjectForDrawings> GetProjectInfo(string cnn, int projectID) 
    { 

     return await Task.Run(() => 
     { 
      ProjectForDrawings projectForDrawings = DataBase.proc_GetProject_ForDrawings.ToRecord<ProjectForDrawings>(cnn, projectID); 

      projectForDrawings.Submittals = DataBase.proc_GetSubmittal.ToList(cnn, projectID); 

      projectForDrawings.ProjectLeafs = DataBase.proc_GetProjectLeafs.ToList<ProjectLeaf>(cnn, projectID); 

      projectForDrawings.Revisions = DataBase.proc_GetRevisionsForProject.ToList<Revisions>(cnn, projectID); 

      return projectForDrawings; 
     }); 
    } 

答えて

1

に返送するための

必要はありませんか?

それをバックグラウンドスレッド(Task.Run)へのスケジュールの仕事をし、それが完了するのを非同期(await)を待ちます。この作業では、一度に1つのデータベースプロセスを実行し、完了するまでバックグラウンドスレッドを同期してブロックします。

どのようにこれらの呼び出しを並行して実行できますか?

あなたがTask.WhenAllと、それらすべてすべてのタスクを起動し、awaitことができます。しかし

public static async Task<ProjectForDrawings> GetProjectInfo(string cnn, int projectID) 
{ 
    ProjectForDrawings projectForDrawings = DataBase.proc_GetProject_ForDrawings.ToRecord<ProjectForDrawings>(cnn, projectID); 

    var submittalsTask = Task.Run(() => DataBase.proc_GetSubmittal.ToList(cnn, projectID)); 
    var leafsTask = Task.Run(() => DataBase.proc_GetProjectLeafs.ToList<ProjectLeaf>(cnn, projectID)); 
    var revisionsTask = Task.Run(() => DataBase.proc_GetRevisionsForProject.ToList<Revisions>(cnn, projectID)); 

    await Task.WhenAll(submittalsTask, leafsTask, revisionsTask); 

    projectForDrawings.Submittals = await submittalsTask; 
    projectForDrawings.ProjectLeafs = await leafsTask; 
    projectForDrawings.Revisions = await revisionsTask; 
    return projectForDrawings; 
} 

を、多くの(?ほとんどの)データベースは、データベース接続ごとに複数のクエリを許可していないので、これはよいですデータベースでは機能しません。また、データベースの呼び出しを最初に並列化することはお勧めできません。自己申告されたサービス拒否を引き起こす可能性があります。最後に、using Task.Run in the implementation is not a good pattern(私のブログで説明した理由から) - 自然な非同期メソッドを使う方が良いでしょう。

+0

ありがとうございます。 –

+0

この記事では、SQL Serverの2005年以降には接続プールがあり、呼び出し元が同じ接続上でdbを呼び出した場合、使用可能な接続の1つを取得して使用すると述べています。開いている接続がない場合は、呼び出し元に選択可能な一連の使用可能な接続がスローされます。これはここではゆるやかな話ですが、これを正しく理解していますか? –

+0

@ AlumCloud.Com:これは 'DataBase'メソッドの実装方法によって異なります。彼らがすべて独立した 'DbConnection'を使っているなら、それはうまくいくはずです。それらがすべて同じ 'DbConnection'インスタンスを使用している場合は、例外が表示されます。 –

関連する問題