2013-08-24 18 views
1

如果我需要一個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()下添加東西。

但希望它是正確的。

+1

不要在對象上使用,並在程序啓動時對其進行初始化,並在程序關閉時進行處理。問題是你無法保證其他人不會在對象上使用''使用'? – crush

+0

問題是,我應該這樣做嗎? Visual Studio恨我什麼時候不使用Using,它說(你需要處理一次性對象),即使我告訴它把對象放在Close上。所以它只是讓我感到困惑 – Zerowalker

+0

爲什麼你立即在你的'Initialize()'塊中處理它?那只是爲了測試VS中的警告消息嗎? – crush

回答

3

表單項目項目模板讓程序員陷入困境。他們知道你不應該編輯Designer.cs文件。但它並不那麼直截了當。打開文件,並注意地區:

#region Windows Form Designer generated code 

這是的代碼你不應該亂用。並且注意處置(布爾)覆蓋是高於這個區域。這意味着編輯它就好了。

最好的辦法是從Designer.cs文件中將Dispose()方法簡單地剪切/粘貼到表單的源代碼文件中。按照分析儀的建議,現在你沒有問題了:

protected override void Dispose(bool disposing) { 
     if (disposing) Queue.Dispose(); 
     if (disposing && (components != null)) { 
      components.Dispose(); 
     } 
     base.Dispose(disposing); 
    } 
+0

謝謝,它與其他人的答案相同,但它解釋了更多:) – Zerowalker

+0

與表單的形式相比有什麼優點或缺點訂閱自己的'FormClosed'或'Disposed'方法? – supercat

1

只因爲一個物體是一次性的,並不意味着你必須處置它!不要使用using塊:這會在對象超出範圍之後處理該對象。只需實例化對象並在自己的時間內處理它(如果您希望在整個應用程序的整個生命週期中使用它,則永遠不要這樣做)。

+0

啊,那很好聽:)雖然,要創建它在開始時,我應該在那裏做,因爲有很多地方,我應該這樣做,FormLoad,在初始化,或在私人myDisposableobject object = new myDisposableobject()開始; ? – Zerowalker

+0

保存一次性物品的主要參考在哪裏? – crush

+0

該引用位於頂部,作爲該類中的專用變量。 – Zerowalker

1

Visual Studio警告您,您的對象(名爲Capture的窗體)具有一次性使用的字段。這是說當你處理表單時,你也應該處理BlockingCollection。這是正確的。它無法知道您的應用程序是否會在表單處理後繼續運行,因此當您完成此任務時,它會嘮叨您清理表單及其一次性字段。

+0

但是我如何「清理」它?我正在處理這個對象,但它仍然不能「得到它」。我該怎麼做有什麼問題嗎? – Zerowalker

+0

不要將對象放置在實例化的地方(它幾乎會立即停止使用)。相反,將對象放置在窗體的Dispose方法中(如果還沒有一個,則添加一個)。 – CSJ

+0

所以我需要把它放在Designer.cs代碼中?因爲我認爲這是我能看到的Dispose方法。 – Zerowalker

相關問題