nop*_*nop 5 .net c# dispose c#-8.0
当它为真时,我在循环中调用以下方法,这会导致自动重新连接。由于我使用关键字using,它是在每个客户端上处置 ClientWebSockettry/catch return false还是仅在到达 ConnectAsync 末尾时才处置它?
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;
}
Run Code Online (Sandbox Code Playgroud)
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;
}
}
Run Code Online (Sandbox Code Playgroud)
这是以下内容的简写:
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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我认为还值得强调此评论:
我更担心您正在处理分配给 _clientWebSocket 字段的内容
clientWebSocket将被释放,但因为你分配_clientWebSocket给 this ( _clientWebSocket = clientWebSocket;),varibale 指向的对象也将被释放!他们是一样的东西。他们互相引用。我想这不是您希望在这里发生的情况,但从您共享的代码中很难看出。
| 归档时间: |
|
| 查看次数: |
370 次 |
| 最近记录: |