Asynchronous ADO:一路异步到管子下面?
好的,所以“一路异步”是命令。但什么时候会有问题 例如,如果您对资源的访问有限,例如在数据库连接或文件中,您何时停止使用异步方法而支持同步方法 让我们回顾一下异步数据库调用的复杂性: (不放置Asynchronous ADO:一路异步到管子下面?,asynchronous,async-await,ado.net,system.io.file,Asynchronous,Async Await,Ado.net,System.io.file,好的,所以“一路异步”是命令。但什么时候会有问题 例如,如果您对资源的访问有限,例如在数据库连接或文件中,您何时停止使用异步方法而支持同步方法 让我们回顾一下异步数据库调用的复杂性: (不放置.ConfigureAwait(false)以确保可读性。) 步骤: 应该是合理无害的,没有什么可担心的 但是现在我们已经在一个可能有限的连接池中获得了一个开放连接。如果在等待步骤2时,其他长时间运行的任务在任务计划程序中位于行的最前面,该怎么办 更糟糕的是,我们正在等待一个开放的连接(很可能是增加了延迟)
.ConfigureAwait(false)
以确保可读性。)
步骤:
希望有更深入的见解。谢谢。由于数据库连接池在较低协议级别的工作方式,高级打开/关闭命令对性能没有太大影响。一般来说,内部线程调度IO通常不是瓶颈,除非您有一些真正长时间运行的任务—我们说的是CPU密集型或更糟的—内部阻塞。这将很快耗尽你的线程池,事情将开始排队
我还建议您进行调查,尤其是断路器hystrix的实施。它的工作方式是允许您将代码分组到命令中,并由命令组管理命令执行,命令组基本上是专用的和隔离的线程池。好处是如果你有一个嘈杂的、长时间运行的命令,它只能耗尽自己的命令组线程池,而不会影响应用程序的其余部分。库的这一部分还有许多其他优点,主要是断路器实现,也是我个人最喜欢的折叠器之一。假设一个查询GetObjectById的多个传入调用被分组到一个
select*where id in(1,2,3)
查询中,然后结果映射回单独的入站请求。Db call只是一个例子,实际上可以是任何东西。由于数据库连接池在较低协议级别的工作方式,高级打开/关闭命令对性能没有太大影响。一般来说,内部线程调度IO通常不是瓶颈,除非您有一些真正长时间运行的任务—我们说的是CPU密集型或更糟的—内部阻塞。这将很快耗尽你的线程池,事情将开始排队
我还建议您进行调查,尤其是断路器hystrix的实施。它的工作方式是允许您将代码分组到命令中,并由命令组管理命令执行,命令组基本上是专用的和隔离的线程池。好处是如果你有一个嘈杂的、长时间运行的命令,它只能耗尽自己的命令组线程池,而不会影响应用程序的其余部分。库的这一部分还有许多其他优点,主要是断路器实现,也是我个人最喜欢的折叠器之一。假设一个查询GetObjectById的多个传入调用被分组到一个
select*where id in(1,2,3)
查询中,然后结果映射回单独的入站请求。DB调用只是一个例子,可以是任何事情。 这里有一些要考虑的事情:
// Step 1: Ok, no big deal, our connection is closed, let's open it and wait.
await connection.OpenAsync();
// Connection is open! Let's do some work.
// Step 2: Acquire a reader.
using(var reader = await command.ExecuteReaderAsync())
{
// Step 3: Start reading results.
while(await reader.ReadAsync())
{
// get the data.
}
}
using (connection)
{
await connection.OpenAsync();
using(var reader = await command.ExecuteReaderAsync())
{
while(await reader.ReadAsync())
{
}
}
}
using (connection)
{
connection.Open();
using(var reader = command.ExecuteReader())
{
while(reader.Read())
{
}
}
}
using (connection)
{
await connection.OpenAsync();
using(var reader = command.ExecuteReader())
{
while(reader.Read())
{
}
}
}