C# 是IQueryable和IQueryable<;T>;异步的?
接口C# 是IQueryable和IQueryable<;T>;异步的?,c#,linq,iqueryable,C#,Linq,Iqueryable,接口IQueryable和IQueryable是否异步 我的意思是,使用以下代码: void Method() { var customers = CustomerReposity.ToQueryable(); //The execution of query starts here. DoSomething(); foreach (var customer in customers) // The foreach await to finish cu
IQueryable
和IQueryable
是否异步
我的意思是,使用以下代码:
void Method()
{
var customers = CustomerReposity.ToQueryable(); //The execution of query starts here.
DoSomething();
foreach (var customer in customers) // The foreach await to finish
customer.DoSomething();
}
我的上司说得对吗?如果不是,那么实现异步行为的正确形式是什么
也许
async void Method()
{
var customers = CustomerReposity.ToQueryable().ToListAsync(); //The execution of query starts here.
DoSomething();
foreach (var customer in await customers) // The foreach await to finish
customer.DoSomething();
}
这是个好主意吗?不,
IQueryable
和IQueryable
不是异步的,它们不需要异步。这两个接口提供了从源中提取某些数据的方法,但由源提供异步支持。如果源将返回内存中的所有数据,那么异步使用它是没有意义的。但是,如果源是从网络“流式传输”的,则异步枚举它可能是有意义的。这个问题似乎是:何时使用异步方法?@T–nNguyễ不,我知道什么时候使用asynchronimous,问题是IQueryable接口在默认情况下是否异步。IQueryable
与async
无关ToListSync
只是一种使用异步任务(需要Wait
)将项目转换为列表的扩展方法。除了Tan的回复之外,IQueryable
更像是,我会在您需要时将其提供给您,或者不同的加载方式。我甚至不会费心去异步你的第一个代码块。@T–nNguyễn当我调用IQueryable.toListSync()
时,查询的执行开始?在foreach上等待它是一个好主意,因为在我使用foreach之前查询是并行运行的吗?DoSomething()
方法可以长期运行。更准确地说,接口(和接口成员定义)不能是异步的。只要接口成员实现的方法满足异步
方法的要求(例如返回任务
或任务
),接口成员的实现就可以是异步的。更准确地说,只有方法才可以是异步的。:-)好的,我想我的问题是错误的。我知道IQueryable
defer查询的执行,直到它在foreach中被转换或使用。我的问题是,如果检索数据源是一个长期运行的过程(如数据库连接),如果我在foreach中使用IQueryable
或IQueryable
,线程将被阻塞,直到我得到结果为止?在foreach中使用查询之前,是否可以异步启动查询执行?正在调用IQueryable.ToAsyncEnumerable()
或IQueryable.ToListSync()
在foreach中使用查询之前启动查询执行的正确方法?等待xxx。ToListSync()
将异步执行查询,也就是说,等待此方法将导致线程返回到线程池,并可以运行其他内容,直到执行查询并将结果返回到数据库。您可以对foreach(wait customers中的var customer)进行编码。正是这样做的。因此,是的,这是正确的方法。是的,当您在不等待的情况下调用xxx.ToListAsync()
时,查询执行开始,您可以执行其他操作。Do,yes,DoSomething()
将在后台执行查询时并行执行。