我在循环中调用下面的方法,虽然它是真的,这会导致自动重新连接.由于我使用的是using关键字,它是在每个try/catch return false上处理ClientWebSocket,还是在到达ConnectAsync末尾时只处理if

private async Task<bool> ConnectAsync(CancellationToken cancellationToken)
{
    using var clientWebSocket = new ClientWebSocket(); // TODO: Check if it's actually disposed
    _clientWebSocket = clientWebSocket;

    try
    {
        await clientWebSocket.ConnectAsync(new Uri(_url), cancellationToken);
    }
    catch
    {
        return false;
    }

    try
    {
        while (clientWebSocket.State == WebSocketState.Open && !cancellationToken.IsCancellationRequested)
        {
            var bytesReceived = new ArraySegment<byte>(new byte[1024]);
            var receiveResult = await clientWebSocket.ReceiveAsync(bytesReceived, cancellationToken);
            var message = Encoding.UTF8.GetString(bytesReceived.Array, 0, receiveResult.Count);
            
            ...
        }
    }
    catch
    {
        return false;
    }

    try
    {
        if (clientWebSocket.State == WebSocketState.Open)
        {
            await clientWebSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "bye", CancellationToken.None);
        }
    }
    catch
    {
        return false;
    }

    return true;
}

推荐答案

using var clientWebSocket = new ClientWebSocket();只是语法上的糖分,它是:

private async Task<bool> ConnectAsync(CancellationToken cancellationToken)
{
    using( var clientWebSocket = new ClientWebSocket())
    {
        _clientWebSocket = clientWebSocket;

        try
        {
            await clientWebSocket.ConnectAsync(new Uri(_url), cancellationToken);
        }
        catch
        {
            return false;
        }

        try
        {
            while (clientWebSocket.State == WebSocketState.Open && !cancellationToken.IsCancellationRequested)
            {
                var bytesReceived = new ArraySegment<byte>(new byte[1024]);
                var receiveResult = await clientWebSocket.ReceiveAsync(bytesReceived, cancellationToken);
                var message = Encoding.UTF8.GetString(bytesReceived.Array, 0, receiveResult.Count);
                
                ...
            }
        }
        catch
        {
            return false;
        }

        try
        {
            if (clientWebSocket.State == WebSocketState.Open)
            {
                await clientWebSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "bye", CancellationToken.None);
            }
        }
        catch
        {
            return false;
        }

        return true;

    }
}

这是以下的缩写:

private async Task<bool> ConnectAsync(CancellationToken cancellationToken)
{
    var clientWebSocket = new ClientWebSocket();
    try
    {
        _clientWebSocket = clientWebSocket;

        try
        {
            await clientWebSocket.ConnectAsync(new Uri(_url), cancellationToken);
        }
        catch
        {
            return false;
        }

        try
        {
            while (clientWebSocket.State == WebSocketState.Open && !cancellationToken.IsCancellationRequested)
            {
                var bytesReceived = new ArraySegment<byte>(new byte[1024]);
                var receiveResult = await clientWebSocket.ReceiveAsync(bytesReceived, cancellationToken);
                var message = Encoding.UTF8.GetString(bytesReceived.Array, 0, receiveResult.Count);
                
                ...
            }
        }
        catch
        {
            return false;
        }

        try
        {
            if (clientWebSocket.State == WebSocketState.Open)
            {
                await clientWebSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "bye", CancellationToken.None);
            }
        }
        catch
        {
            return false;
        }

        return true;

    }
    finally
    {
        if (clientWebSocket != null) {
            ((IDisposable)clientWebSocket).Dispose();  
        }
    }
}

我认为它也值highlighting this comment英镑:

我更担心的是你在处理你分配的东西

clientWebSocket会被处理掉,但因为你把_clientWebSocket分配给这个(_clientWebSocket = clientWebSocket;),the object that varibale is pointing at will get disposed as well!它们是一样的.他们互相参照.我想这不是你想在这里发生的事情,但很难从你分享的代码中分辨出来.

Csharp相关问答推荐

将实例绑定方法传递到列表foreach

MongoDB实体框架核心:表达必须可写

Unity如何在PlayerPrefs中保存数据?

System. InvalidOperationException:无法将数据库中的字符串值i转换为映射的ItemType枚举中的任何值''''

ASP.NET MVC中创建视图的过滤器

将轮询与超时同步

如何在C#中从正则表达式中匹配一些数字但排除一些常量(也是数字)

在命名管道上使用GRPC ASP.NET核心时如何配置命名管道权限

如何在WPF的树视图中显示一个对象的两个或多个属性,其中只有一个是分层项?

调用Task.Run()与DoSomethingAsync()有什么不同?

C#中浮点数的System.Text.Json序列化问题

用于管理System.Text.Json中的多态反序列化的自定义TypeInfoResolver

正确处理嵌套的本机集合

正在try 从Blazor中的API读取JSON

使用ASP.NET MVC for Lemon Squeezy X-Signature创建散列

JSON串行化程序问题.SQLite中的空值

除非首先访问使用的终结点,否则本地API上的终结点不起作用

为什么C#中的类型别名不能在另一个别名中使用?

在c#中,使用Okta和Blazor时,LocalReDirect()陷入循环,出现错误&请求太多.

如何提高C#中比较大 struct 的性能?