<Attention>
その1に載せたコードを前提に書いています。
</Attention>
前回の続きになります。
以前に呼ませていただいたことのあるエントリを探してきました。
菊池 Blog:デザイナで生成されたコードは信用しちゃいけない(www.ailight.jp 内)
菊池 Blog:System.ComponentModel はすでに死んだ、IDisposableも死につつある(www.ailight.jp 内)
前回説明した
components と Dispose がうまく機能していませんよってことらしいです。私自身も前回 BindingSource クラスを置いてみるときに BackgroundWorker クラスも置いてみたんです。BackgroundWorker クラスはこちら↓
MSDN:BackgroundWorker クラス(http://msdn2.microsoft.com/ja-jp/library/system.componentmodel.backgroundworker(VS.80).aspx)
BackgroundWorker クラスはComponent クラスを継承しています。Component クラスが IDisposable インターフェイスを実装しているため、BackgroundWorker クラスも相当のメソッドを持っていますね。BackgroundWorker クラスがどんな実装をしているのかは知る由もありませんが、私は使命感を持っています。IDisposable
に対してはその破棄の責任を持たなければいけません。
さて、出来上がったコードは
Private Sub InitializeComponent()
Me.BackgroundWorker1 = New System.ComponentModel.BackgroundWorker
Me.SuspendLayout()
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 12.0!)
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
Me.ClientSize = New System.Drawing.Size(292, 269)
Me.Name = "Form1"
Me.Text = "Form1"
Me.ResumeLayout(False)
End Sub
BackgroundWorker クラスのコンストラクタは IContainer をパラメータにとらないので、ほったらかしになってしまっています。
ん~どうしましょう・・・。とりあえず、components に add メソッドがあるのでこれ↓でいいのでしょうか?
Public Class Form1
Public Sub New()
MyBase.New()
InitializeComponent()
If Me.components Is Nothing Then
Me.components = New System.ComponentModel.Container
End If
Me.components.Add(Me.BackgroundWorker1)
End Sub
End Class
一応 BackgroundWorker1 の Dispose は呼ばれているようですが。
components とか Component とか Container とか・・・
頭から煙出てきました。orz
# そもそも Button クラスなどもIDisposable ですね。どうなっているのでしょう・・・?