C# 异步等待返回任务<;列表<;T>&燃气轮机;而不是列表<;T>;关于调用aync方法
我试图理解AsyncAwait的用法,我研究了一些博客文章,现在我已经编写了一个测试代码,但它并没有按照我期望的方式工作 我有一个返回列表的方法:C# 异步等待返回任务<;列表<;T>&燃气轮机;而不是列表<;T>;关于调用aync方法,c#,.net,asynchronous,task-parallel-library,async-await,C#,.net,Asynchronous,Task Parallel Library,Async Await,我试图理解AsyncAwait的用法,我研究了一些博客文章,现在我已经编写了一个测试代码,但它并没有按照我期望的方式工作 我有一个返回列表的方法: private List<Employee> GetEmployees() { IList<Employee> list = new List<Employee>(); list.Add(new Employee() { Id = 1, Age = 20, Name = "Kavin" }); list.A
private List<Employee> GetEmployees()
{
IList<Employee> list = new List<Employee>();
list.Add(new Employee() { Id = 1, Age = 20, Name = "Kavin" });
list.Add(new Employee() { Id = 2, Age = 30, Name = "Alen" });
list.Add(new Employee() { Id = 3, Age = 20, Name = "Suresh" });
list.Add(new Employee() { Id = 4, Age = 30, Name = "Jay" });
list.Add(new Employee() { Id = 5, Age = 20, Name = "Nanda" });
list.Add(new Employee() { Id = 5, Age = 20, Name = "Kavin" });
list.Add(new Employee() { Id = 5, Age = 20, Name = "Kavin" });
list.Add(new Employee() { Id = 1, Age = 23, Name = "Test" });
return list;
}
VisualStudio告诉我它返回任务
,它的用法是:
List<Employee> result = await TestEmployeesGetAsync();
List result=await TestEmployeesGetAsync();
为什么我需要在调用方法上放置await如果我放置
await
它当然会给出编译器错误,因为await
也应该具有异步。有没有人能帮我弄清楚如何调用它,这样我就可以得到列表
而不是任务
你基本上需要等待测试人员etasync
返回的任务结果。您可以使用wait
异步执行此操作,它将结果展开到List
中,或者您可以使用result
属性从任务中获取结果。然而,这可能会导致您需要小心
使用async wait
时,它倾向于沿着调用链向上移动,即等待async
方法要求您在另一个async
方法中执行该操作(如您所发现的),等待该方法要求您在另一个async
方法中执行该操作,因此async
方法在代码库中传播,直到到达事件处理程序或Main
(不能标记为async
)
async
方法的激增并不罕见,为了避免这种情况,您可以使用task.wait
和task.Result
等待任务完成,但这些都是阻塞方法,可能会导致上述死锁。它也是一种称为syncoverasync的反模式,它违背了异步执行工作的目的,因为您最终会阻塞等待它完成
正如@BenVoigt所指出的,一个例外是当您启动多个异步请求,然后使用Task.WaitAll
阻止等待所有任务完成时
如果我把wait放在调用方法上,为什么我需要把wait放在调用方法上
当然是编译器错误,因为await也应该具有异步
为了理解您正在运行的异步方法,编译器需要一些依赖项。该信号是方法声明上的async
修饰符。一旦将其标记为async
,就可以使用wait
关键字。这就是为什么async“一直”在调用堆栈中传播的原因,因为当您调用一个async方法并需要等待其结果时,您需要使用async修饰符标记使用方法
为了使您的方法有效,您需要执行以下操作:
public async Task GetEmployeesAsync()
{
List<Employees> result = await TestEmployeesGetAsync();
}
公共异步任务GetEmployeesAsync()
{
列表结果=等待TestEmployeesGetAsync();
}
作为旁注,请注意。,@JohnWoo我如何从中获取
List
您已经演示了如何获取List
但是您需要在方法上添加async
关键字,以便可以使用wait
。我已经创建了async方法,现在我想调用它并获取List
,以便调用我的async方法。我必须创建另一个方法?看看在上一篇文章中,您可以了解async wait
以及如何使用它。它并没有完全违背目的,因为在等待过程中仍然可以发生多个异步操作。例如,使用Task.WaitAll
,我将展开“它倾向于在调用链中占据上风”。如果您还不知道这是什么意思,那么很难理解这句话。您的意思是,如果不将它包装到另一个异步方法中,我就无法调用它?99%的情况下,您应该以这种方式调用异步代码。
List<Employee> result = await TestEmployeesGetAsync();
public async Task GetEmployeesAsync()
{
List<Employees> result = await TestEmployeesGetAsync();
}