3

私はさまざまな一意のエンティティのストアドプロシージャを呼び出しようとしています。 1つのエンティティのストアドプロシージャには約33秒かかります。だから私はスレッドを使って呼び出すことにしました。それがうまく動作しますが、私は、レコードのアプリケーションからまたはバックエンドからチェックしたときに更新されませんように複数のレコードを更新するスレッド内のストアドプロシージャを呼び出す

public bool ExecuteTaxRateLinkingParallel(int mapID, int createdBy) 
{ 
    try 
    { 
     int snapshotID = (int)(HttpContext.Current.Session[GlobalConstant.snapShotID]); 
     List<TaxEntity> taxEntities = new List<TaxEntity>(); 
     List<Task> tasks = new List<Task>(); 
     using (var ctx = new TopazDbContainer()) 
     { 
      taxEntities = ctx.TaxEntities.AsParallel().Where(t => t.IsActive == true).ToList<TaxEntity>(); 
     } 

     Parallel.ForEach<TaxEntity>(taxEntities, (entity) => 
     { 
      //SqlConnection connection; SqlTransaction trans; SqlCommand command; 
      // break this into pieces of 5 
      var task = Task.Factory.StartNew(() => 
      { 
       using (var pctx = new TopazDbContainer()) 
       { 
        try 
        { 
         int taxEntityID = entity.TaxEntityID; 
         pctx.CommandTimeout = 5000; 
         //string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["TOPAZDBConnectionStringParallel"].ConnectionString; 
         //connection = new SqlConnection(connectionString); 
         //command = new SqlCommand("dbo.[Usp_TaxRatesLinkingParallel]", connection); 
         //trans = connection.BeginTransaction(); 
         //command.CommandType = CommandType.StoredProcedure; 
         //command.Parameters.AddWithValue("@MapID", mapID); 
         //command.Parameters.AddWithValue("@UserID", createdBy); 
         //command.Parameters.AddWithValue("@TaxEntityID", taxEntityID); 
         //command.Parameters.AddWithValue("@SnapshotID", snapshotID); 
         //connection.Open(); 
         //command.CommandTimeout = 5000; 
         //command.ExecuteReader().AsParallel(); 

         pctx.ContextOptions.LazyLoadingEnabled = true; 

         //pctx.ExecuteStoreCommand("Exec [Usp_TaxRatesLinkingParallel] @MapID={0},@UserID={1},@TaxEntityID={2},@SnapshotID{3}", new SqlParameter("MapID", mapID), new SqlParameter("UserID", createdBy), new SqlParameter("TaxEntityID", taxEntityID), new SqlParameter("SnapshotID", snapshotID)); 
         var param = new DbParameter[] { new SqlParameter("UserID", createdBy), new SqlParameter("TaxEntityID", taxEntityID), new SqlParameter("SnapshotID", snapshotID) }; 
         pctx.ExecuteStoreCommand("Exec [Usp_TaxRatesLinkingParallel] @MapID,@UserID,@TaxEntityID,@SnapshotID", param); 

         //var result = output.FirstOrDefault(); 
        } 
        catch (TaskCanceledException tx) 
        { 
        } 
        catch (Exception e) 
        { 
        } 
        finally 
        { 
         pctx.SaveChanges(); 
         pctx.Connection.Close(); 
        } 
       } 
      }, TaskCreationOptions.PreferFairness); 

      tasks.Add(task); 

      try 
      { 
       Task.WaitAll(tasks.ToArray()); 
      } 
      catch (AggregateException ae) 
      { 
       ae.Handle((x) => 
       { 
        if (x is UnauthorizedAccessException) 
        { 
         return true; 
        } 
        else 
        { 
         return false; 
        } 
       }); 
      } 
      catch (Exception ex) 
      { 
       throw ex; 
      } 
     }); 

     return true; 
    } 
    catch (Exception ex) 
    { 
     TopazErrorLogs.AddTopazErrorLogBL(ex, 1, 1); 
     throw new TopazCustomException(GlobalConstant.errorMessage); 
    } 
} 

SPは思わいくつかの上記の文の場合:

は、ここで私が行っている臨床試験の一部です。

ヘルプが必要です。

+0

なぜストアドプロシージャが長くかかるのですか?あなたはそれを並行して実行することが実際にあなたを助けるでしょうか? – svick

+0

はい私たちはそれを並行して実行すると助けになります。一度にいくつかのテーブルを挿入したり更新したりするのには時間がかかります。 – Bilal

+0

本当ですか?この時間がかかる場合は、データベースサーバーがディスク上で待機しているか、一部のデータベースロックで待機していることが原因です。その場合、並列化は役に立ちません。 – svick

答えて

1

まだ.NET 4.5にいない場合は、これらの拡張メソッドを使用してコマンドasyncを実行できます。

using System.Diagnostics.Contracts; 
using System.Threading.Tasks; 
using System.Xml; 

namespace System.Data.SqlClient 
{ 
    public static class SqlCommandExtensions 
    { 
     public static Task<SqlDataReader> ExecuteReaderAsync(this SqlCommand command) 
     { 
      Contract.Requires(command != null); 
      return ExecuteReaderAsync(command, null); 
     } 

     public static Task<SqlDataReader> ExecuteReaderAsync(this SqlCommand command, object state) 
     { 
      Contract.Requires(command != null); 
      return Task.Factory.FromAsync<SqlDataReader>(command.BeginExecuteReader, command.EndExecuteReader, state); 
     } 

     public static Task<XmlReader> ExecuteReaderXmlAsync(this SqlCommand command) 
     { 
      Contract.Requires(command != null); 
      return ExecuteReaderXmlAsync(command, null); 
     } 

     public static Task<XmlReader> ExecuteReaderXmlAsync(this SqlCommand command, object state) 
     { 
      Contract.Requires(command != null); 
      return Task.Factory.FromAsync<XmlReader>(command.BeginExecuteXmlReader, command.EndExecuteXmlReader, state); 
     } 

     public static Task<int> ExecuteNonQueryAsync(this SqlCommand command) 
     { 
      Contract.Requires(command != null); 
      return ExecuteNonQueryAsync(command, null); 
     } 

     public static Task<int> ExecuteNonQueryAsync(this SqlCommand command, object state) 
     { 
      Contract.Requires(command != null); 
      return Task.Factory.FromAsync<int>(command.BeginExecuteNonQuery, command.EndExecuteNonQuery, state); 
     } 
    } 
} 
+2

そして、「非同期処理= True; MultipleActiveResultSets = true;」を追加するのを忘れないでください。接続文字列に追加します。 –

0

ここでは、非同期データベースクエリではありません。見てください:あなたはブログの記事内の詳細な情報を見つけることが

public async Task<IEnumerable<Car>> GetCarsAsync() { 

    var connectionString = 
     ConfigurationManager.ConnectionStrings["CarGalleryConnStr"].ConnectionString; 

    var asyncConnectionString = new SqlConnectionStringBuilder(connectionString) { 
     AsynchronousProcessing = true 
    }.ToString(); 

    using (var conn = new SqlConnection(asyncConnectionString)) { 
     using (var cmd = new SqlCommand()) { 

      cmd.Connection = conn; 
      cmd.CommandText = selectStatement; 
      cmd.CommandType = CommandType.Text; 

      conn.Open(); 

      using (var reader = await cmd.ExecuteReaderAsync()) { 

       return reader.Select(r => carBuilder(r)).ToList(); 
      } 
     } 
    } 
} 

ここ

Asynchronous Database Calls With Task-based Asynchronous Programming Model (TAP) in ASP.NET MVC 4

は新しい非同期で非同期のデータベースコールの一例である/機能を待っています。

+0

残念ながら、プロジェクトはほぼ完了しています。私たちは.Net 4.0を使用していますので、非同期で使用することはできません。 – Bilal