Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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# 异步返回对象列表_C#_Linq_Asynchronous - Fatal编程技术网

C# 异步返回对象列表

C# 异步返回对象列表,c#,linq,asynchronous,C#,Linq,Asynchronous,我试图循环遍历一个结果集,运行一个查询来检索数据,然后将该数据添加到一个列表并返回它 问题是,我尝试异步执行此操作,但得到错误: 'System.Collections.Generic.List' 不包含“ToListSync”和最佳扩展名的定义 方法重载 'System.Data.Entity.QueryableExtensions.ToListSync(System.Linq.IQueryable)' 有一些无效的参数 以下是该方法的代码: public async Task<List

我试图循环遍历一个结果集,运行一个查询来检索数据,然后将该数据添加到一个列表并返回它

问题是,我尝试异步执行此操作,但得到错误:

'System.Collections.Generic.List' 不包含“ToListSync”和最佳扩展名的定义 方法重载 'System.Data.Entity.QueryableExtensions.ToListSync(System.Linq.IQueryable)' 有一些无效的参数

以下是该方法的代码:

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; 
}