問題一:
StartAsync_clientWebSocket處理和的處置_tokenSource。那么我真的需要處理這些Dispose()嗎?我認為我應該_semaphore.Dispose()只保留在 中Dispose(),因為我的代碼已經處理了其余部分。
問題2:
如果用戶忘記呼叫Dispose()或包裹它using怎么辦?它通常通過呼叫Dispose()解構器/終結器來解決,但在這種情況下,我的類是sealed.
public sealed class Client : IDisposable
{
private readonly SemaphoreSlim _semaphore = new(1, 1);
private ClientWebSocket? _clientWebSocket;
private CancellationTokenSource? _tokenSource;
public void Dispose()
{
_semaphore.Dispose();
// TODO: Do I need to dispose these since my code below does that?
_clientWebSocket?.Dispose();
_clientWebSocket = null;
_tokenSource?.Cancel();
_tokenSource = null;
}
public Task StartAsync()
{
_clientWebSocket = new ClientWebSocket();
_tokenSource = new CancellationTokenSource();
try
{
...
}
catch (Exception ex)
{
}
finally
{
_clientWebSocket?.Dispose();
_clientWebSocket = null;
_tokenSource?.Cancel();
_tokenSource = null;
}
}
public ValueTask SendAsync()
{
if (_clientWebSocket is { State: WebSocketState.Open })
{
return;
}
...
}
}
uj5u.com熱心網友回復:
StartAsync 處理 _clientWebSocket 和 _tokenSource 的處置。那么我真的需要在 Dispose() 中處理這些嗎?我認為我應該只在 Dispose() 中保留 _semaphore.Dispose(),因為我的代碼已經處理了其余部分的處理。
那為什么它們是欄位?聽起來它們應該是區域變數,在這種情況下,它們不會成為你的類的 dispose 方法的一部分。
也忘記您正在使用的模式并using改用。
如果用戶忘記呼叫 Dispose() 或將其包裝在使用中怎么辦?
這是他們的選擇,但有一個 Roslyn 分析儀警告:CA2000
它通常通過在解構器/終結器中呼叫 Dispose() 來解決
不太常見,更經常,但你是對的。如果呼叫者不這樣做,您希望您的終結器在您的物件之后清理,顯然需要注意執行緒(終結器將在哪個執行緒上運行?該問題的答案會阻止您在終結器中處理 OpenGL 句柄)。
在這種情況下,我的班級是密封的
這與您的問題無關,您可以在密封類中實作終結器。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/467139.html
上一篇:Linq按狀態分割資料
