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

时间:2018-08-15 10:27:20

标签: c# asynchronous task configureawait

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

public async Task<Command> BuildCommunicationCommand

作为对象:

public Command BuildCommand

我有以下内容:

 public Command BuildCommand()
    {
        return BuildCommunicationCommand().GetAwaiter().GetResult();
    }

但是已经被告知要尝试避免这种情况,并且我应该等待Task,因此我们不会阻塞UI线程。我认为做到这一点的最佳方法是使BuildCommand方法和任何其他调用它的方法异步。这将是一个巨大的变化,并且对于使用BuildCommand的其他类来说并不是真正需要的。我不想使用.Result造成阻塞,因此在这种情况下,请尽力使用ConfigureAwait(false):

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

            return Command.GetAwaiter().GetResult();
        }

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

这是我第一次处理异步任务,因此,如果以上任何内容都是垃圾,很抱歉!

1 个答案:

答案 0 :(得分:0)

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

<mat-checkbox #checkbox1 (click)="matBoxClick({{name}})"></mat-checkbox>

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