我有以下方法
public async Task<bool> Connect()
{
lock (_connectingLock)
{
if (_connecting)
throw new IOException("Already connecting");
_connecting = true;
}
try {
await tcpClient.ConnectAsync(...);
}
catch (SocketException e)
{
return false;
}
finally
{
lock (_connectingLock)
{
_connecting = false;
}
}
}
现在,我希望连续调用Connect()
来抛出IOException,但它不会发生!
可能是什么原因?
答案 0 :(得分:7)
对Connect()
的调用不能直接抛出异常。异步方法不会抛出异常。相反,他们将返回在等待时将抛出IOException
的任务。 (即任务有问题。)
如果那不是你想要的,你应该分开来电:
public Task<bool> Connect()
{
// Eager validation of state...
lock (_connectingLock)
{
if (_connecting)
throw new IOException("Already connecting");
_connecting = true;
}
return ConnectImpl();
}
private async Task<bool> ConnectImpl()
{
try {
await tcpClient.ConnectAsync(...);
}
catch (SocketException e)
{
return false;
}
finally
{
lock (_connectingLock)
{
_connecting = false;
}
}
}
目前尚不清楚这种情况是否合适。抛出像ArgumentException
这样的东西通常很好,但如果错误不代表调用代码本身的错误,我认为返回错误的任务就好了。