如果我需要一個Disposable項目我的應用程序的整個運行? 有些情況下,這似乎是必要的,例如,如果我想同步2線程: System.Collections.Concurrent.BlockingCollection。如果整個運行需要一次性物品,該怎麼辦?
如果一個線程使用Using並處理它,另一個線程無法關閉或正在等待BlockingCollection(您可以設置超時),則它將得到一個Disposed Exception。
有可能更多的情況下,這是真的,所以有辦法繞過這個,或者我應該簡單地使對象初始化,並將其處理關閉?
編輯:這是Visual Studio告訴我什麼時候使用一次性項目。
首先我如何使用它,在一個例子:
private void Initialize()
{
Queue = new System.Collections.Concurrent.BlockingCollection<byte[]>();
Queue.Dispose();
}
,我得到這樣的:
warning : CA2213 : Microsoft.Usage : 'Capture' contains field 'Capture.Queue' that is of IDisposable type: 'BlockingCollection<byte[]>'. Change the Dispose method on 'Capture' to call Dispose or Close on this field.
使剛剛get's我迷惑。我已經告訴它,它已經取得了後處置權,它仍然要我處理掉吧:S
編輯2:
這是應該是活着的配置對象的正確方式整個程序運行?
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
Queue.Dispose();
}
base.Dispose(disposing);
}
正如你所看到的,我在那裏添加了隊列。
雖然這看起來不錯,但感覺很奇怪,可以使用Designer.cs文件並在components.Dispose()下添加東西。
但希望它是正確的。
不要在對象上使用,並在程序啓動時對其進行初始化,並在程序關閉時進行處理。問題是你無法保證其他人不會在對象上使用''使用'? – crush
問題是,我應該這樣做嗎? Visual Studio恨我什麼時候不使用Using,它說(你需要處理一次性對象),即使我告訴它把對象放在Close上。所以它只是讓我感到困惑 – Zerowalker
爲什麼你立即在你的'Initialize()'塊中處理它?那只是爲了測試VS中的警告消息嗎? – crush