如何尽早退出包装可等待方法的异步方法?

How to exit an async method early that wraps an awaitable method?

我的 class 正在包装 TcpListener,我正在尝试更新它以使用现代 async 语言。

它提出了一个问题,如果一个方法应该提前退出该怎么办。如果这是旧代码:

    public void Connect()
    {
        if (tcp != null)
          tcp.Connect(config.IPAddress, config.Port);
    }

然后我从这样的事情开始:

    public Task ConnectAsync()
    {
        if (tcp != null)
          { ???? }    
        return tcp.ConnectAsync(config.IPAddress, config.Port);
    }

但是在tcp==null的情况下我应该return怎么办?有没有"null awaitable"?

我也不确定我的方法是否应该指定 async 在这种情况下我正在包装另一个方法 - 我确定我 想要await 调用的方法。这可以编译,但我认为它不正确:

    public async Task ConnectAsync()
    {
        if (tcp != null)
            return;

        await tcp.ConnectAsync(config.IPAddress, config.Port);
    }

您可以return完成任务:

public Task ConnectAsync()
{
    if (tcp == null)
    {
        return Task.CompletedTask;
    }
    return tcp.ConnectAsync(config.IPAddress, config.Port);
}

Task.CompletedTask也是一个单例实例,所以定期调用这个方法不会有额外的开销。

您也可以将您的方法写成 async 而 return 什么都不写:

public async Task ConnectAsync()
{
    if (tcp != null)
    {
        await tcp.ConnectAsync(config.IPAddress, config.Port);
    }
}