2016-10-19 17 views
0

나는 센서 세부 정보 목록을 가지고 있으며 각 센서에 대한 구성 설정을 얻고 비즈니스 논리를 적용해야합니다. 나는 각 센서가 같은 메소드를 호출하고 동시에 로직을 실행하는 것처럼 Aynchrosnously하고 싶다. Async를 시도해 보았고, 아래는 샘플이다. 아래에 나와있는대로 각 센서를 비동기 적으로 실행하는 데 도움이 될 경우 알려 주시기 바랍니다.비동기, 비동기 대기

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을 한 번에 열 수 있습니다. 실행중인 시스템의 종류와 예상되는 내용이 명확하지 않습니다.