Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是IQueryable和IQueryable<;T>;异步的?_C#_Linq_Iqueryable - Fatal编程技术网

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()
将在后台执行查询时并行执行。