Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.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# 异步等待返回任务<;列表<;T>&燃气轮机;而不是列表<;T>;关于调用aync方法_C#_.net_Asynchronous_Task Parallel Library_Async Await - Fatal编程技术网

C# 异步等待返回任务<;列表<;T>&燃气轮机;而不是列表<;T>;关于调用aync方法

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

我试图理解AsyncAwait的用法,我研究了一些博客文章,现在我已经编写了一个测试代码,但它并没有按照我期望的方式工作

我有一个返回列表的方法:

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