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

Jam*_*urn 4 c# asynchronous task configureawait

返回以下任务时的最佳实践是什么:

public async Task<Command> BuildCommunicationCommand
Run Code Online (Sandbox Code Playgroud)

作为一个对象:

public Command BuildCommand
Run Code Online (Sandbox Code Playgroud)

我有以下内容:

 public Command BuildCommand()
    {
        return BuildCommunicationCommand().GetAwaiter().GetResult();
    }
Run Code Online (Sandbox Code Playgroud)

但被告知要尝试避免这种情况,并且我应该等待任务,这样我们就不会阻塞 UI 线程。我认为最好的方法是使 BuildCommand 方法和调用它的其他方法异步。这将是一个巨大的改变,对于使用 BuildCommand 的其他类来说并不是真正需要的。我不想使用 .Result 导致阻塞,因此在这种情况下最好使用ConfigureAwait(false):

 public Command BuildCommand()
        {
            var Command = BuildCommunicationCommand().ConfigureAwait(false);

            return Command.GetAwaiter().GetResult();
        }
Run Code Online (Sandbox Code Playgroud)

我可以使用ConfigureAwait(false) 等待进程完成,然后调用.GetAwaiter().GetResult() 将其作为对象Command 返回吗?

这是我第一次使用异步任务,所以如果以上任何内容完全是垃圾,我很抱歉!

Han*_*ian 6

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

 private string GetData()
 {
     var task = GetDataAsync();
     task.Wait();
     return task.Result;
 }
 private async Task<string> GetDataAsync()
 {
     return "Hello";
 }
Run Code Online (Sandbox Code Playgroud)

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