当前位置: 首页 > 编程语言 > C#

调用异步方法时异步await返回Task-List-而不是List分享

时间:2023-04-11 01:09:14 C#

异步调用异步方法时异步await返回Task而不是List我想了解异步await的用法,研究了一些博客文章,现在我已经制作了一个测试代码,但它没有按我预期的方式工作。我有一个返回列表的方法:privateListGetEmployees(){IListlist=newList();list.Add(newEmployee(){Id=1,Age=20,Name="Kavin"});list.Add(newEmployee(){Id=2,Age=30,Name="Alen"});list.Add(newEmployee(){Id=3,Age=20,Name="Suresh"});list.Add(newEmployee(){Id=4,Age=30,Name="Jay"});list.Add(newEmployee(){Id=5,Age=20,Name="Nand??a"});list.Add(newEmployee(){Id=5,Age=20,Name="Kavin"});list.Add(newEmployee(){Id=5,Age=20,Name="Kavin"});list.Add(newEmployee(){Id=1,Age=23,Name="Test"});返回列表;然后我写了我的异步方法:privateasyncTaskTestEmployeesGetAsync(){varresult=awaitTask.Run(()=>GetEmployees());返回结果;当我调用这个方法时:varResult=TestEmployeesGetAsync();visualstudio告诉我它返回Task并且它的用法是:Listresult=awaitTestEmployeesGetAsync();为什么我需要等待调用方法如果我等待它当然会给出编译器错误,因为等待应该有异步。有人可以澄清我是如何调用它的,以便我可以获得一个List而不是Task为什么我需要等待调用方法,如果我await它当然会给出编译器错误,因为await也应该有异步。编译器需要一些依赖项才能了解您正在运行异步方法。信号是方法声明中的异步修饰符。要将其标记为异步,您可以使用await关键字。这就是为什么async会“一路”向上传播到调用堆栈,就像调用async方法并需要等待其结果一样,您需要使用async修饰符标记消费方法。为了使您的方法起作用,您需要执行以下操作:publicasyncTaskGetEmployeesAsync(){Listresult=awaitTestEmployeesGetAsync();作为旁注,注意不要在同步方法上公开异步包装器。您基本上需要等待TestEmployeesGetAsync返回的任务结果。您可以使用await异步执行此操作,然后将结果解压缩到列表中,或者您可以使用Result属性从任务中获取结果。但是,这可能会导致死锁,因此您需要小心。使用async-await它往往会沿着调用链上升,即等待异步方法需要您在另一个异步方法中执行此操作(就像您异步),并且等待该方法需要您使用另一个异步方法,因此异步方法会通过代码库传播,直到它到达事件处理程序或Main(不能标记为异步)。异步方法的泛滥并不少见,为避免这种情况,您可以等待Task.Wait和Task.Result完成任务,但这些都是阻塞方法,可能会导致上述死锁。它也是一种称为同步-异步的反模式,它违背了异步工作的目的,因为您最终会阻塞等待它完成。正如@BenVoigt所指出的,一个例外是当您启动多个异步请求,然后使用Task.WaitAll阻止等待所有任务完成时。以上就是C#学习教程:异步等待调用异步方法时返回的是Task而不是List。收藏不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: