我想实现从数据库异步返回子项列表的函数。所以我写了一个函数:
public async Task<IEnumerable<object>> GetFiles(int parentId)
{
var data = from file in DB.Files
where file.ParentId == parentId
select new { name = file.Name, id = file.Id };
return data;
}
但是我可以看到一个警告:异步方法las'等待'运算符并将同步运行。如何将此函数重写为异步?
答案 0 :(得分:4)
您可以使用ToListAsync()
。
https://msdn.microsoft.com/en-us/library/dn220258(v=vs.113).aspx
var data = await DB.Files
.Where(file => file.ParentId == parentId)
.Select
(
new
{
name = file.Name,
id = file.Id
}
).ToListAsync();
return data;
可替换地:
var data = from file in DB.Files
where file.ParentId == parentId
select new { name = file.Name, id = file.Id };
return await data.ToListAsync();
请注意,这将查询数据。此外,您可以重新考虑您的方法名称。当方法为异步时,naming convention建议您追加&#34; Async&#34;到您的方法名称。
按照惯例,你追加&#34; Async&#34;到具有的方法的名称 异步或异步修饰符。
答案 1 :(得分:1)
ToListAsync()方法不再适用于枚举。您可以使用如下的FromResult方法:
var data = from file in DB.Files
where file.ParentId == parentId
select new { name = file.Name, id = file.Id };
return await Task.FromResult(data);
答案 2 :(得分:-1)
在某些情况下,您应该使用Task.run
public async Task<IEnumerable<object>> GetFiles(int parentId)
{
var data = await Task.Run(()=> from file in DB.Files
where file.ParentId == parentId
select new { name = file.Name, id = file.Id }).ToList();
return data;
}
答案 3 :(得分:-2)
您也可以使用TaskCompletionSource
-
public static async Task<string> ReturnAsync()
{
var tsc = new TaskCompletionSource<string>();
tsc.SetResult("hello world");
return await tsc.Task;
}