2016-10-19 3 views
0

Ich habe eine Liste der Sensordetails und ich muss Konfigurationseinstellungen für jeden Sensor erhalten und einige Geschäftslogik anwenden. Ich möchte Aynchrosnous tun, wie jeder Sensor die gleiche Methode aufrufen und gleichzeitig seine Logik ausführen wird. Ich habe versucht mit Async und warte und unten ist Probe. Bitte lassen Sie mich wissen, wenn die folgenden helfen, jeden Sensor auszuführen, führen Sie asynchron aus.Asynchron, Async Warten

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

In 'GetTestDownTime' sollten Sie alle asynchronen Methoden verwenden, z. B.' SqlConnection.OpenAsync' und 'SqlDataReader.ReadAsync'. –

Antwort

0

Ja, sie werden asynchron ausgeführt. Aber nicht parallel. Und ich denke nicht, dass Sie versuchen sollten, es parallel zu machen, es sei denn, Sie haben ein sehr klares Leistungsproblem.

Parallel gehen (mit zum Beispiel Parallel.ForEach()) würde viele SqlConnections auf einmal öffnen. Unklar, auf welcher Art von System Sie laufen und was zu erwarten wäre.

Verwandte Themen