如何尽早退出包装可等待方法的异步方法?
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);
}
}
我的 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);
}
}