如何在 Task<T> 函数中等待任务?
How can I await task in Task<T> function?
我找不到正确的方法:
public Task<List<HWElDocument>> GetHWElDocumentsAsync(int? ProjectID = null)
{
// Get all Items
if (ProjectID == null)
return database.Table<HWElDocument>().ToListAsync();
// Or all items meeting a condition
else
{
// This line has to be awaited, I think ?!?
List<HWDocuProj> projList = await database.Table<HWDocuProj>().Where( item => item.ProjID == ProjectID).ToListAsync();
// So that I can use the result here:
return database.Table<HWElDocument>().Where(item => projList.Exists(p => p.ProjID == item.ID)).ToListAsync();
}
}
由于 await 关键字,编译器要求将函数转换为异步函数。但是我这样做了,因此它拒绝结果是 Task<T'>
... 如果我将 return 类型更改为 async List<HWElDocument'>
,则此行会引发错误:
return database.Table<HWElDocument>().ToListAsync();
那么实现这个的正确方法是什么?
无论何时调用异步函数,您都需要“等待”它。您只需在开头放置“await”关键字即可:
return await database.Table<HWElDocument>().Where(item => projList.Exists(p => p.ProjID == item.ID)).ToListAsync();
和
return await database.Table<HWElDocument>().ToListAsync();
您的方法签名中还需要“异步”:
public async Task<List<HWElDocument>> GetHWElDocumentsAsync(int? ProjectID = null)
Microsoft 有更详细的 C# 异步编程指南:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/async/
If I change the return type to async List<HWElDocument'>
您需要 一个 async
修饰符 和 一个 Task
return类型。所以这个签名应该有效:
public async Task<List<HWElDocument>> GetHWElDocumentsAsync(int? ProjectID = null)
async
会告诉编译器在内部使用异步状态机,并允许您在方法内部使用 await
关键字。
当你想从异步方法中 return 某些东西时,你将需要一个 Task<T>
return 类型。当使用 async
时,编译器也会确保自动将您的 return 值包装在任务中,因此您可以直接 return 值。
因此您的 returning 行应该 也 使用 await
以便等待来自 ToListAsync
的任务,然后结果将是自动包装在您方法的结果任务中:
public Task<List<HWElDocument>> GetHWElDocumentsAsync(int? ProjectID = null)
{
// Get all Items
if (ProjectID == null)
return await database.Table<HWElDocument>().ToListAsync();
// Or all items meeting a condition
else
{
List<HWDocuProj> projList = await database.Table<HWDocuProj>()
.Where( item => item.ProjID == ProjectID)
.ToListAsync();
return await database.Table<HWElDocument>()
.Where(item => projList.Exists(p => p.ProjID == item.ID))
.ToListAsync();
}
}
我找不到正确的方法:
public Task<List<HWElDocument>> GetHWElDocumentsAsync(int? ProjectID = null)
{
// Get all Items
if (ProjectID == null)
return database.Table<HWElDocument>().ToListAsync();
// Or all items meeting a condition
else
{
// This line has to be awaited, I think ?!?
List<HWDocuProj> projList = await database.Table<HWDocuProj>().Where( item => item.ProjID == ProjectID).ToListAsync();
// So that I can use the result here:
return database.Table<HWElDocument>().Where(item => projList.Exists(p => p.ProjID == item.ID)).ToListAsync();
}
}
由于 await 关键字,编译器要求将函数转换为异步函数。但是我这样做了,因此它拒绝结果是 Task<T'>
... 如果我将 return 类型更改为 async List<HWElDocument'>
,则此行会引发错误:
return database.Table<HWElDocument>().ToListAsync();
那么实现这个的正确方法是什么?
无论何时调用异步函数,您都需要“等待”它。您只需在开头放置“await”关键字即可:
return await database.Table<HWElDocument>().Where(item => projList.Exists(p => p.ProjID == item.ID)).ToListAsync();
和
return await database.Table<HWElDocument>().ToListAsync();
您的方法签名中还需要“异步”:
public async Task<List<HWElDocument>> GetHWElDocumentsAsync(int? ProjectID = null)
Microsoft 有更详细的 C# 异步编程指南:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/async/
If I change the return type to
async List<HWElDocument'>
您需要 一个 async
修饰符 和 一个 Task
return类型。所以这个签名应该有效:
public async Task<List<HWElDocument>> GetHWElDocumentsAsync(int? ProjectID = null)
async
会告诉编译器在内部使用异步状态机,并允许您在方法内部使用 await
关键字。
当你想从异步方法中 return 某些东西时,你将需要一个 Task<T>
return 类型。当使用 async
时,编译器也会确保自动将您的 return 值包装在任务中,因此您可以直接 return 值。
因此您的 returning 行应该 也 使用 await
以便等待来自 ToListAsync
的任务,然后结果将是自动包装在您方法的结果任务中:
public Task<List<HWElDocument>> GetHWElDocumentsAsync(int? ProjectID = null)
{
// Get all Items
if (ProjectID == null)
return await database.Table<HWElDocument>().ToListAsync();
// Or all items meeting a condition
else
{
List<HWDocuProj> projList = await database.Table<HWDocuProj>()
.Where( item => item.ProjID == ProjectID)
.ToListAsync();
return await database.Table<HWElDocument>()
.Where(item => projList.Exists(p => p.ProjID == item.ID))
.ToListAsync();
}
}