C# 异步返回对象列表
我试图循环遍历一个结果集,运行一个查询来检索数据,然后将该数据添加到一个列表并返回它 问题是,我尝试异步执行此操作,但得到错误: 'System.Collections.Generic.List' 不包含“ToListSync”和最佳扩展名的定义 方法重载 'System.Data.Entity.QueryableExtensions.ToListSync(System.Linq.IQueryable)' 有一些无效的参数 以下是该方法的代码:C# 异步返回对象列表,c#,linq,asynchronous,C#,Linq,Asynchronous,我试图循环遍历一个结果集,运行一个查询来检索数据,然后将该数据添加到一个列表并返回它 问题是,我尝试异步执行此操作,但得到错误: 'System.Collections.Generic.List' 不包含“ToListSync”和最佳扩展名的定义 方法重载 'System.Data.Entity.QueryableExtensions.ToListSync(System.Linq.IQueryable)' 有一些无效的参数 以下是该方法的代码: public async Task<List
public async Task<List<IHFData>> GetHFServiceData(string wtTransfereeId)
{
var hfDataList = new List<HFData>();
Parallel.ForEach(aauthorizationList, item =>
{
// code to retrieve data from database (truncated)
HFData hfData = Db.hfAuthorizations.AsNoTracking()....SingleOrDefault();
hfDataList.Add(hfData);
}
return await hfDataList.ToListAsync(); // errors on this line
}
公共异步任务GetHFServiceData(字符串WTEID)
{
var hfDataList=新列表();
Parallel.ForEach(aaAuthorizationList,item=>
{
//从数据库检索数据的代码(截断)
HFData HFData=Db.hfAuthorizations.AsNoTracking()…SingleOrDefault();
hfDataList.Add(hfData);
}
return wait hfDataList.ToListAsync();//此行有错误
}
如何异步生成并返回列表?正如错误消息所告诉您的,没有异步创建列表的
list
方法。此时您已经有了列表
从多个线程向列表中添加项目也是不安全的,就像您在并行foreach循环中所做的那样
您也不应该首先对集合中的每个项目执行数据库查询。相反,您应该执行一个数据库查询,根据列表中的信息获取所需的所有项目。该查询应以调用ToListAsync
结束
这里也不需要使用
async
方法,您只需直接返回ToListAsync
的结果。您的代码存在一些巨大的问题
首先,您正在调用hfDataList.Add
在Parallel.ForEach
,List
不是线程安全的,您不能在不锁定的情况下调用Add
其次,当错误告诉您只能在具有接口IQueryable
的类型上调用ToListSync
时,您是在未实现该接口的列表上调用它
执行查询的正确方法是
public Task<List<IHFData>> GetHFServiceData(string wtTransfereeId)
{
return Db.hfAuthorizations.AsNoTracking()....ToListAsync()
}
似乎ToListAsync
是肯定的,我知道只需要一个linq查询并调用ToListAsync()会更容易;然而,我们之所以使用foreach,是因为它对于一个查询来说太复杂了。是否可以使用foreach异步构建和返回列表?@user1477388我已经更新了答案,显示了如何更接近于您以前的方式。关于这一点的问题:调试时,代码似乎命中了foreach循环,然后就可以继续了直接返回到返回行,因此hfDataList
总是空的。你知道为什么它会跳过异步/添加代码吗?@user1477388你确定aaauthorizationlist
不是空的吗?从你描述的情况看,它听起来像是空的。
public async Task<List<IHFData>> GetHFServiceData(string wtTransfereeId)
{
var hfDataList = new List<HFData>();
foreach(var item in aauthorizationList)
{
// code to retrieve data from database (truncated)
HFData hfData = await Db.hfAuthorizations.AsNoTracking()....SingleOrDefaultAsync(); //This method is now async.
hfDataList.Add(hfData);
}
//just return the list when you are done.
return hfDataList;
}