1

我有以下方法

    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,但它不会发生!

可能是什么原因?

4

1 回答 1

8

调用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,但如果错误不代表调用代码本身的错误,我认为返回一个错误的任务是可以的。

于 2013-04-04T16:45:44.753 回答