タイトル : Re: CA2213の対処方法 投稿日 : 2016/10/14(Fri) 15:23 投稿者 : 魔界の仮面弁士
一つ気になったのは、カウントアップの変数。 マルチスレッドなプログラムである以上、 Public countZ As Integer countZ += 1 というコードは聊か悪手だと思いますよ。 単にサンプルコードとして単純化したからだとは思いますので、 今回はこれ以上触れずにおきます。(別投稿 No.11748 として追記しておきました) さて、本題。 > Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing Dispose が必要なのは確かですが、フォームが閉じずに破棄された場合には、 FormClosing が発生しませんので、このタイミングでは不十分なのです。 これが System.Threading.Timer ではなく System.Windows.Forms.Timer であったなら liTimer = New Timer(Me.components) あるいは Me.components.Add(liTimer) とすることで、自動的に Dispose されるようにもできるのですけれど。 > 私なりに調べて、いろいろ試したのですが、解決できません。 コードエディタの中上のドロップダウンから「Form1」を選択してください (「(Form1 イベント)」ではない事に注意)。そしてさらに続けて、 コードエディタの右上のドロップダウンから、淡色表示されている 「Dispose」を選択してみてさい。 Form1.vb から Form1.Designer.vb へ、コードウィンドウが切り替わるはずです。 この時記述されている内容は、概ね、下記の内容になっていると思います。 (フォームのデザイン状況によっては、多少異なっているかもしれません) -------------------- 'フォームがコンポーネントの一覧をクリーンアップするために dispose をオーバーライドします。 <System.Diagnostics.DebuggerNonUserCode()> _ Protected Overrides Sub Dispose(ByVal disposing As Boolean) Try If disposing AndAlso components IsNot Nothing Then components.Dispose() End If Finally MyBase.Dispose(disposing) End Try End Sub -------------------- この Try ブロック内に、以下のコードを追加します。 If disposing AndAlso liTimer IsNot Nothing Then liTimer.Dispose() liTimer = Nothing End If これにより、警告 CA2213 が解消されるはずです。 現在の FormClosing イベントは不要になりますので、削除しておきましょう。 もし、Form1.Designer.vb にあるコードをあまり書き換えたくないのなら、 Sub Dispose(Boolean) メソッドが書かれた実装を、Form1.Designer.vb 上から Form1.vb 上へと移動させてしまっても構いません。 移動に当たり、DebuggerNonUserCode 属性は付けたままでも外してしまっても OK です。 |