tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル 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 です。

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。