我有以下方法
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,但它并没有发生!
可能是什么原因?
最佳答案
调用 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
之类的东西通常没问题,但如果错误不代表调用代码本身的错误,我认为返回一个错误的任务就可以了。
关于c# - 异步任务配置中未抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15816978/