如何提前退出包装了一个等待方法的异步方法?

问题描述 投票:0回答:1

我的课程正在包装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条件下,我应该返回什么?是否有一些“可以等待的空值”?

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

public async Task ConnectAsync() { if (tcp != null) return; await tcp.ConnectAsync(config.IPAddress, config.Port); }
c# task-parallel-library
1个回答
2
投票
您可以返回已完成的任务:

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

Task.CompletedTask也是单例实例,因此,如果定期调用此方法,则不会产生额外的开销。

您也可以将您的方法编写为async,什么也不返回:

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

© www.soinside.com 2019 - 2024. All rights reserved.