为了账号安全,请及时绑定邮箱和手机立即绑定

在非异步方法中返回异步任务的正确方法

在非异步方法中返回异步任务的正确方法

C#
大话西游666 2021-11-28 19:49:50
返回以下任务时的最佳实践是什么:public async Task<Command> BuildCommunicationCommand作为对象:public Command BuildCommand我有以下几点: public Command BuildCommand()    {        return BuildCommunicationCommand().GetAwaiter().GetResult();    }但是被告知要尽量避免这种情况,我应该等待任务,这样我们就不会阻塞 UI 线程。我认为最好的方法是使 BuildCommand 方法异步以及调用它的任何其他方法。这将是一个巨大的变化,对于使用 BuildCommand 的其他类来说并不是真正需要的。我不想通过使用 .Result 导致阻塞,所以在这种情况下最好使用 ConfigureAwait(false): public Command BuildCommand()        {            var Command = BuildCommunicationCommand().ConfigureAwait(false);            return Command.GetAwaiter().GetResult();        }我可以使用 ConfigureAwait(false) 等待进程完成,然后调用 .GetAwaiter().GetResult() 将其作为对象 Command 返回吗?这是我第一次使用异步任务,所以如果以上任何一项都是垃圾,我很抱歉!
查看完整描述

1 回答

?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

您可以将异步方法的调用包装在另一个等待任务完成然后返回结果的方法中。当然,这会阻塞调用 GetData 的线程。但它摆脱了异步“病毒”。像这样的东西:


 private string GetData()

 {

     var task = GetDataAsync();

     task.Wait();

     return task.Result;

 }

 private async Task<string> GetDataAsync()

 {

     return "Hello";

 }

不过,您正在寻求最佳实践,那就是根据需要将所有内容更改为异步。


查看完整回答
反对 回复 2021-11-28
  • 1 回答
  • 0 关注
  • 183 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信