C# C以异步方式与数据库交互,不工作。
我只是想创建一个虚拟的ASP.NET MVC项目,在这里我想探索更多关于async&Wait的知识。我在DB访问层和存储库层创建了异步方法,并且我还确保操作也是以异步方式编写的。我注意到一个方法的执行大约需要7毫秒,所以从逻辑上讲,如果我调用该方法3次,我也应该需要7毫秒或7毫秒左右!但是大约需要20-23毫秒。我确信我做错了什么。我的代码片段如下所示: 数据访问层: 存储库: 行动:C# C以异步方式与数据库交互,不工作。,c#,asp.net-mvc,async-await,C#,Asp.net Mvc,Async Await,我只是想创建一个虚拟的ASP.NET MVC项目,在这里我想探索更多关于async&Wait的知识。我在DB访问层和存储库层创建了异步方法,并且我还确保操作也是以异步方式编写的。我注意到一个方法的执行大约需要7毫秒,所以从逻辑上讲,如果我调用该方法3次,我也应该需要7毫秒或7毫秒左右!但是大约需要20-23毫秒。我确信我做错了什么。我的代码片段如下所示: 数据访问层: 存储库: 行动: 您正在等待每个调用,因此在它进入下一个调用之前,它将暂停执行。考虑创建三个任务,并等待它们: 您正在等待每个调
您正在等待每个调用,因此在它进入下一个调用之前,它将暂停执行。考虑创建三个任务,并等待它们:
您正在等待每个调用,因此在它进入下一个调用之前,它将暂停执行。考虑创建三个任务,并等待它们:
是什么让您认为用wait调用3个方法会并行执行它们?并行编程和异步编程是不同的概念。在编写代码之前,您应该熟悉该理论。此外,用Task.Run包装方法被认为是一种不好的做法。此外,创建线程池线程来执行I/O操作是对处理能力的浪费。最后一条注释是,为了了解如何以真正异步的方式执行该查询,您可能希望查看ORM,而不是加载数据表,然后获取entities@CamiloTerevinto我知道基本的区别!我既不期望并行性能,也不期望精确的7毫秒!请仔细阅读我的问题,我提到应该需要7毫秒或7毫秒左右。。。所以它可能是10或13或任何接近的值。单次执行3次合乎逻辑吗!这就是为什么我脑海中会出现这样的问题:那是因为任务。延迟是一个异步操作。正如我在第二篇评论中提到的,您正在将同步操作包装到一个任务中,这是一种浪费。是什么让您认为用wait调用3个方法将并行执行它们?并行编程和异步编程是不同的概念。在编写代码之前,您应该熟悉该理论。此外,用Task.Run包装方法被认为是一种不好的做法。此外,创建线程池线程来执行I/O操作是对处理能力的浪费。最后一条注释是,为了了解如何以真正异步的方式执行该查询,您可能希望查看ORM,而不是加载数据表,然后获取entities@CamiloTerevinto我知道基本的区别!我既不期望并行性能,也不期望精确的7毫秒!请仔细阅读我的问题,我提到应该需要7毫秒或7毫秒左右。。。所以它可能是10或13或任何接近的值。单次执行3次合乎逻辑吗!这就是为什么我脑海中会出现这样的问题:那是因为任务。延迟是一个异步操作。正如我在第二篇评论中提到的,您正在将同步操作包装到任务中,这是一种浪费。
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();
}
var task1 = aa.GetAllCustomers();
var task2 = aa.GetAllCustomers();
var task2 = aa.GetAllCustomers();
await Task.WhenAll(task1, task2, task3);