C # Взаимодействие с базой данных асинхронным способом, не работает. - PullRequest
0 голосов
/ 22 октября 2018

Я просто хотел создать фиктивный проект ASP.NET MVC, в котором я хотел бы больше узнать об асинхронности и ожидании. Я создал асинхронные методы в доступе к БД Layer и Repository Layer, и я также уверен, что действие также написано в асинхронном режиме.путь.Я заметил, что для выполнения одного метода требуется около 7 мс, поэтому логично, что если я вызову метод 3 раза, мне также потребуется 7 мс или около 7 мс!Но это занимает около 20-23 мс.Я уверен, что я делаю что-то ужасно неправильно.Ниже приведен фрагмент кода:

Уровень доступа к данным:

    public async Task<DataTable> DtGetAllCustomers()
    {
        await Task.Run(() =>
        {
            _dtCustomer = new DataTable();
            _connectionString = Repo.GetConnString();
            _spName = "spGetCus";
            _spParameters = new SqlParameter[]
            {
            new SqlParameter("@QryOption",1)
            };
            using (var conn = new SqlConnection(_connectionString))
            {
                using (var cmd = new SqlCommand())
                {
                    cmd.Connection = conn;
                    cmd.CommandText = _spName;
                    cmd.Parameters.AddRange(_spParameters);
                    cmd.CommandType = CommandType.StoredProcedure;
                    conn.Open();

                    using (SqlDataAdapter da = new SqlDataAdapter(cmd))
                    {
                        da.Fill(_dtCustomer);
                        conn.Close();
                        da.Dispose();
                    }
                }
            }

        });

        return _dtCustomer;
    }

Хранилище:

 public async Task<List<CustomerModel>> GetAllCustomers()
            {
                _dtCustomer = await _customerDal.DtGetAllCustomers();
                List<CustomerModel> allCustomers = new List<CustomerModel>();
                return allCustomers = (from DataRow row in _dtCustomer.Rows
                                       select new CustomerModel
                                       {
                                           CustomerId = (int)row["CustomerId"],
                                           CustomerName = (string)row["CustomerName"]
                                       }).ToList();
            }

АКЦИЯ:

public async Task<ActionResult> Index()
        {
            var watch = System.Diagnostics.Stopwatch.StartNew();
            List<CustomerModel> model = new List<CustomerModel>();
            CustomerRepo2 aa = new CustomerRepo2();
            await aa.GetAllCustomers();
            await aa.GetAllCustomers();
            await aa.GetAllCustomers();
            watch.Stop();
            var elapsedMs = watch.ElapsedMilliseconds;
            ViewBag.time = elapsedMs;
            return View();
        }

1 Ответ

0 голосов
/ 22 октября 2018

Вы ожидаете каждого вызова, поэтому, прежде чем он перейдет к следующему, он приостановит выполнение.Попробуйте создать три задачи и ожидать их всех с помощью Task.WhenAll():

var task1 = aa.GetAllCustomers();
var task2 = aa.GetAllCustomers();
var task2 = aa.GetAllCustomers();
await Task.WhenAll(task1, task2, task3);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...