异步任务配置中未抛出异常

时间:2013-04-04 16:42:42

标签: c#

我有以下方法

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

可能是什么原因?

1 个答案:

答案 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这样的东西通常很好,但如果错误不代表调用代码本身的错误,我认为返回错误的任务就好了。