2016-10-19 415 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())會一次打開許多SqlConnections。不清楚你正在運行什麼樣的系統,以及預期的是什麼。