【问题标题】:Asynchronous , Async Await异步,异步等待
【发布时间】:2023-03-12 22:07:01
【问题描述】:

我有传感器详细信息列表,我需要获取每个传感器的配置设置并应用一些业务逻辑。我想做 Aynchrosnously,就像每个传感器都会调用相同的方法并同时执行其逻辑。我尝试使用 Async 和 await,下面是示例。请让我知道,如果以下内容有助于异步执行每个传感器。

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;
            }
        }

【问题讨论】:

  • GetTestDownTime 中,您应该使用所有可以使用的异步方法,例如SqlConnection.OpenAsyncSqlDataReader.ReadAsync

标签: asynchronous async-await


【解决方案1】:

是的,它们将异步执行。但不是并行的。而且我认为你甚至不应该尝试让它并行,除非你有一个非常明显的性能问题。

并行(例如Parallel.ForEach())将同时打开许多SqlConnections。不清楚您正在运行什么样的系统,以及预期会发生什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-22
    • 1970-01-01
    • 1970-01-01
    • 2018-12-09
    • 1970-01-01
    • 2016-07-07
    • 2016-03-25
    相关资源
    最近更新 更多