簡體   English   中英

取消在Dispose方法內進行處置

[英]Cancel dispose inside Dispose method

有沒有一種方法可以從Dispose方法中取消處理,換句話說,當調用A.Dispose()時不要處理A。

更新我沒有很好地解釋,因為我想不出一種很好的表達方式。 我所擁有的是一個類,該類在一個單獨的線程中運行的彈出窗口中顯示進度條(選取框)。 創建進度彈出窗口后,將返回類似控制器的一次性對象,因此我們可以執行以下操作:

using (var progress = Dialogs.ShowProgress("Please wait..."))
{
    // do lots of stuff here
    progress.UpdateStatus("Please wait some more...");
    // do more stuff
}

當using塊退出時,進度窗口將關閉並銷毀。

現在,我遇到了這種情況,即在此塊中發生的事情也創建了一個進度窗口,而不是返回一個新對象並創建一個新窗口,而是想返回第一個實例創建的對象,並且僅在第一個實例處理后銷毀它。

更新 OK,我所做的是通過每個Dialogs.ShowProgress()調用創建一個新的IDisposable對象,並將原始控制器對象附加到該對象。 這些對象一經完成就被丟棄,而控制器僅在它是唯一要丟棄的對象時才被丟棄。

正如其他人所說,以一種可能無法真正實現的方式實現IDisposable是一個壞主意。 這是實現您要執行的操作的另一種方法:

interface IMaybeDisposable
{
    bool TryDispose(); //return false if dispose was canceled
}

您可以像這樣使用它:

IMaybeDisposable maybe = //something
try
{
    // do something with maybe
}
finally
{
    if (maybe.TryDispose())
        // yay, it disposed!
    else
        // hm, it didn't dispose; do something else
}

當然。 只是不做您將要處理的所有操作。 您不需要積極地做任何特別的事情。

但是要小心; 當某人處置一個對象時,他們希望該對象實際上處置它的非托管資源,而不是無視您並始終堅持使用它們。

我這樣做會很小心。 如果您取消在using塊末尾處放一個方法,那么您將丟失對該對象的引用,並且您將永遠沒有機會再次處理該對象的內容,這意味着如果您這樣做會浪費資源。不小心。 特別是,只有在dispose方法釋放對大對象的引用時,我才自己做這件事,無論出於何種原因,我都不希望立即收集垃圾。 我不會跳過對文件,數據庫連接,網絡套接字或任何其他無法垃圾回收的句柄的釋放句柄。

正如評論者指出的那樣,我將嘗試重構我的代碼,以便通過取消該處置來解決的任何其他問題都可以通過其他一些不太危險的方式來解決。

如果您絕對確定需要跳過一些處置的邊緣條件,則可以采用以下一種方法:

public void Dispose()
{
     if(condition)
     {
         // do disposing stuff
     }
}

Dispose所需的后置條件是,客戶端代碼應能夠放棄對對象的所有引用,而不會導致任何必要的清理工作沒有完成。 如果在調用Dispose之前應用了該條件,則Dispose方法可以合法地不執行任何操作。 如果該條件不適用,則Dispose必須這樣做,除非除非或直到這樣做,否則Dispose才能合法返回[請注意,如果Dispose確實啟動了一系列事件,通過這些事件進行清理,則它們實際上並不需要執行清理。在稍后的時間]。 Dispose接口的合同中沒有任何內容允許它有時使對象處於需要進一步清理的狀態,除非它有理由相信清理將通過其他方式進行。

根據您的更新,我將執行以下操作:

 public  void  DoStuff()
{
     DoPrepWork();
     using( var  controller =  TheMethodYouWroteThatShouldReturnAController())
    {
         DoStuffOverControllerLifetime();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM