2014-02-15 57 views
3

考慮到IDisposable的語義,Dispose應該做些什麼,除了清理資源?Dispose應該做什麼 - 只清理資源或執行一些「業務邏輯」?

我看到許多類使用Dispose方法啓動關閉進程和其他一些東西,而不僅僅是「資源清理」工作。例如,如果你在類中有一個線程,需要關閉,你會期望調用Dispose正常關閉這個線程?我想在這個對象上實現一個Stop/Shutdown方法,並在那裏正常關閉線程,而在Dispose中,我將檢查線程是否還活着,以便簡單地調用Abort(暗殺風格:))。

同樣的例子可以是定時器和所有其他資源,在完成對該對象的處理之前可以進行某種終止過程。在.NET衝突的設計

兩個例子:

  • ServiceBase的Windows服務具有調用OnStop以及處置 覆蓋。
  • 來自OWIN的WebApp.Start爲自我託管提供了一個 IDisposable,我猜想服務在 Dispose過程中會關閉。

回答

1

而不是在IDisposable合同的思維,它更有助於思考的IDisposable作爲一般Object合同,說對象不應該要求任何形式的通知以外的情況IDisposable.Dispose就被拋棄之前(的一部分沒有實施IDisposable的物品根本不需要任何通知)。該Dispose方法應該做任何事情,需要前一個對象可以被安全地拋棄做的一切。

這是有問題的唯一方面是執行清理時可能會發生異常,並且Dispose無法知道在這種情況下應該做什麼。如果Dispose正常(非特殊)程序執行過程中調用,就應該清除失敗拋出異常。但是,如果在從異常中展開堆棧時調用堆棧,則可能拋出的任何異常通常會破壞先前異常的所有證據(因此通常會更好地失敗而不是拋出異常)。不幸的是,有沒有辦法通過其Dispose可以告訴適用的情況,因此沒有辦法爲它始終如一地做正確的事清理失敗的情況下。

2

要困難,我已經用處置只有做商業邏輯。例如:

public class UsingBase : IDisposable 
{ 
    protected Action end; 
    public UsingBase(Action start, Action end) { this.end = end; if (start != null) start(); } 
    public void Dispose() { if (end != null) end(); } 
    public void Cancel() { end = null; } 
} 

class HideCursor : UsingBase { public HideCursor() : base(() => Console.CursorVisible = false,() => Console.CursorVisible = true) { } } 

public static void DisplayTitle(...) 
{ 
    ... 
    using (new HideCursor()) 
    { 
     //Display the title 
    } 
    ... 
} 

雖然有些人可能認爲這是濫用語言,但我從ASP.net API獲得了這個想法。

@using (Html.BeginForm()) 
{ 
    ... 
} 

要回到你的問題

例如,如果你有類,這就需要將 關機中的一個線程,你會想到調用Dispose正常關閉 此主題?

我很喜歡它,因爲我經常使用對象來使用它,讓它處理它自己的處理。當然,如果你清楚地記錄你的邏輯,並有明確的理由來區分「優雅的停止」和「處置」,那麼這可能會奏效。

或者換句話說 - 我不想做這種沒有理由:

using (var blah = new Blah()) 
{ 
... 
... 
... 
Blah.SpecialDispose(); 
}//Blah.Dispose(); 

因爲它會導致在使用試圖阻止確切的問題 - 人們忘記書寫的權利包裝代碼(例如最後嘗試)。


編輯:

總結。是的,業務邏輯可以完成處置。是的,Dispose可以很好地處理事情。這些是你提出的主要問題。然而,這並不必然否定,其中的Dispose作爲「最後手段」,並在它的動作更突然的可能的使用情況。這聽起來像你對你的使用案例有信心,在這種情況下繼續。如果你仍然想要反饋,我建議發佈一個更具體的與你的實際用例相關的問題。

+0

是的,你確實有一個點。有時,對於某些用法,使用會造成很好的「濫用」。然而,我也可以說,我從「關機」實際上是對象定義/身份/每個人都知道的一部分的角度看待這個問題,而不是被遺忘的東西。 –

+0

你知道的使用和處置利用方式的不同,你已經看了交替使用情況,你還認爲自己的使用是有效的和邏輯?除非有人發佈一些東西來改變上述情況,否則似乎你正在做出明智的決定 - 我該爭論誰? – NPSF3000