2016-10-19 21 views
0

私はセンサーの詳細のリストを持っており、私は各センサーの設定を取得し、ビジネスロジックを適用する必要があります。私はAynchrosnouslyしたい、各センサーが同じメソッドを呼び出して、同じ時間にそのロジックを実行するように。私は非同期で試してみると、サンプルが下にあります。下記の方法で各センサを非同期に実行すると助けてください。非同期、非同期待機

public static async Task GetSensor() 
     { 
      List<SensorMaster> sensorAddress = GetSensorService(); 
      foreach (SensorMaster sensorInfo in sensorAddress) 
      { 
       await ParseSensor(sensorInfo); 
      } 
     } 

private static async Task ParseSensor(SensorMaster senInfo) 
     { 

       List<Sensor> sTestdownTime = await GetTestDownTime(senInfo); 
       if (DateTime.Parse(sTestdownTime[0].LastHeartBeatAt.ToString()).Year > 1900) 
       { 
        CreateEvent(senInfo, sTestdownTime); 
       }    


     } 

public static async Task<List<Sensor>> GetTestDownTime(SensorMaster senInfo) 
     { 
      List<Sensor> lstSensor = new List<Sensor>(); 
      var connectionString = "Data Source=xxxx;Initial Catalog=xx;persist security info=True;User ID=xx;Password=xxx;"; 
      var asyncConnectionString = new SqlConnectionStringBuilder(connectionString) { AsynchronousProcessing = true }.ToString(); 

      using (var cn = new SqlConnection(asyncConnectionString)) 
      { 
       cn.Open(); 
       SqlCommand cmd = new SqlCommand("SetingSp", cn); 
       cmd.CommandType = CommandType.StoredProcedure; 
       cmd.Parameters.Add(new SqlParameter("@StationType", senInfo.SensorName)); 
       cmd.Parameters.Add(new SqlParameter("@ThresholdValue", senInfo.SensorThreshold)); 
       using (SqlDataReader dr = await cmd.ExecuteReaderAsync()) 
       { 
        if (dr.HasRows) 
        { 
         while (dr.Read()) 
         { 
          Sensor cpData = new Sensor(); 
          cpData.SensorName = dr["SensorName"].ToString(); 
          cpData.LastHeartBeatAt = Convert.ToDateTime(dr["LastTimeStamp"]); 
          lstSensor.Add(cpData); 
         } 
        } 
       } 
       return lstSensor; 
      } 
     } 
+1

'GetTestDownTime'では、例えば' SqlConnection.OpenAsync'と 'SqlDataReader.ReadAsync'のようなすべての非同期メソッドを使うべきです。 –

答えて

0

はい、非同期に実行されます。しかし、並行してではありません。そして、あなたは非常に明確なパフォーマンス上の問題がなければ、それを平行にしようとすべきではないと私は思います。

並行して(例えば、Parallel.ForEach())、多くのSqlConnectionを一度に開くことができます。実行しているシステムの種類と予想される内容が不明です。