看看這行特定的代碼:using var ws = new ClientWebSocket()在下面的類中。考慮到它使用的物件using以及它在一些方法中使用,比如 SendAsync、ReceiveAsync 等,什么時候處理該物件?如果它是在像 Main() 這樣的常規方法中,它通常會在關閉的分支中處理,但在這種情況下,它不會在那里處理。這個類也不繼承IDisposable。我從課堂上洗掉了不必要的細節。
public class Client
{
private ClientWebSocket? _ws;
private async Task<bool> ConnectAsync(CancellationToken cancellationToken)
{
using var ws = new ClientWebSocket();
_ws = ws;
...
}
public async Task SendAsync(string data)
{
...
await _ws.SendAsync(dataBytes, WebSocketMessageType.Text, true, CancellationToken.None);
}
}
uj5u.com熱心網友回復:
您的陳述句是在C# 版本 8using中引入的 C# 新的 using 宣告樣式,這意味著您的陳述句不再有不必??要的嵌套。然而,校長們還是一樣的。考慮以下在 C# 8 之前撰寫代碼的方式:
public class Client
{
private ClientWebSocket? _ws;
private async Task<bool> ConnectAsync(CancellationToken cancellationToken, string data)
{
using (var ws = new ClientWebSocket())
{
// When your code leaves this block, your websocket is disposed
ws.SendAsync(dataBytes, WebSocketMessageType.Text, true, CancellationToken.None);
// Assigning ws to _ws isn't necessary as it isn't usable outside your using statement
_ws = ws;
// The end of your using block - the websocket will now be disposed
}
// This line would fail as your websocket has been disposed
_ws.SendAsync(dataBytes, WebSocketMessageType.Text, true, CancellationToken.None);
}
}
當您的代碼離開 using 塊時,將呼叫 dispose 方法。宣告意味著它將被處理的范圍現在是包含 using 宣告的代碼塊,在這種情況下,您的ConnectAsync方法。因此,即使在將它分配給 _ws 時您仍然有對它的參考,它也不能被使用,因為當您的代碼離開此方法塊時它已經被釋放。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/442032.html
上一篇:計時器在非常特殊的情況下無法觸發
