数据库异步调用

时间:2017-02-24 22:37:55

标签: c# asp.net .net asynchronous webforms

我非常难以绕过异步。我试过阅读了很多问题/答案,论坛等。

我必须对数据库进行大约50次调用(我无法对数据库进行更改以在一次调用中返回所有内容)。所以答案是使用异步,这样我只需要等待最长的呼叫。我正在尝试简单记录10次往返的时间。

我的理论是因为我在一个方法中使用两个异步任务,在调用方法中使用一个。任务看起来像是在完成但还没有完成。这是我的代码。

我现在只记录完成往返所需的时间,但我们的想法是在将来返回List<ResultList>

    protected async void Page_Load(object sender, EventArgs e)
        {
            List<Buildings> bldgList = new List<Buildings>(); 

            //lots of buildings here now.

            Stopwatch GetByOrg = new Stopwatch();
            lblorg.Text = await RunOrg(GetByOrg, bldgList);
        }

        async Task<string> RunOrg(Stopwatch getByOrg, List<Buildings> retVal)
        {
            getByOrg.Start();
            List<Task> tasks = new List<Task>();
            for (int i = 0; i < 10; i++)
            {
                foreach (Buildings b in bldgList)
                {
                    tasks.Add(Task.Run(() => ExecuteOrg(b)));
                }
                //  var tasky = new Task()

            }
            Task.WaitAll(tasks.ToArray());
            getByOrg.Stop();
            return String.Format("{0:00}:{1:00}:{2:00}.{3:00}", getByOrg.Elapsed.Hours, getByOrg.Elapsed.Minutes, getByOrg.Elapsed.Seconds, getByOrg.Elapsed.Milliseconds / 10);
        }
        async Task<List<ResultSet>> ExecuteOrg(Buildings b)
        {
            List<ResultSet> resulty = new List<ResultSet>();
            var asyncconn = new SqlConnectionStringBuilder("That Server Connection") { AsynchronousProcessing = true }.ToString();
            using (SqlConnection conn = new SqlConnection(asyncconn))
            {
                using (SqlCommand cmd = new SqlCommand("rptTotalConcentrators", conn))
                {
                    cmd.CommandType = System.Data.CommandType.StoredProcedure;
                    cmd.Parameters.Add("@school_yr", System.Data.SqlDbType.SmallInt).Value = 2016;

                    conn.Open();
                    using (var reader = await cmd.ExecuteReaderAsync())
                    {

                        while (await reader.ReadAsync())
                        {
                            ResultSet testy = new ResultSet();
                            testy.bldg_no = reader["bldg_no"].ToString();
                            testy.bldg_name = reader["bldg_name"].ToString();
                            testy.school_year = reader["school_year"].ToString();
                            testy.concentrator = reader["conc"].ToString();
                            resulty.Add(testy);
                        }
                    }
                }
            }
            return resulty;
        }

问题是lblorg.Text在完成的毫秒时显示大约.06。 .WhenAll无法正常运作,或其他错误。因为这需要更长的时间。

0 个答案:

没有答案