c# - 异步任务配置中未抛出异常

标签 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,但它并没有发生!

可能是什么原因?

最佳答案

调用 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/

相关文章:

c# - MVVM wpf在 View 模型之间传递参数

c# - ASP.Net core MVC6 在未授权时重定向到登录

c# - 为什么表达式在 linq 中不起作用

c# - 完全即发即忘存储过程 C# .NET Core

c# - 如何确定 C# 中字符的代码页 850 中的索引?

c# - 当 IEnumerable 包含 null 时使用什么异常类

c# - 如果 .NET 支持的 iso 代码不足以发现语言/区域怎么办

c# - 如何使用 C# 通过 html 表单将数据库值与输入进行比较

c# - 带有枚举参数的方法的 Web API 帮助页面

c# - C# 中的二维数组以及如何返回数组