44

アプリケーションのクラスの 1 つで System.Timers.Timer クラスを使用しています。Timer クラスには、IDisposable インターフェイスを実装する親 Component クラスから継承された Dispose メソッドがあることを知っています。以下のクラスのインスタンスは、アプリケーションのライフサイクル中に何度も作成されます。それらのそれぞれには、クラスのライフサイクル中に継続的に Elapsed イベントを生成する Timer クラスのインスタンスがあります。Timer クラスを使用してタイマー オブジェクトを破棄するクラスに IDisposable インターフェイスを実装する必要がありますか? (これをまったく行わないコードを見たことがあります)。次のように以下のクラスを使用すると、一部のアンマネージ リソースが解放されないのではないかと心配しています。

SomeClass someClass = new SomeClass();
someClass.DoSomething();
someClass = null;

クラス:

using System.Timers;

public class SomeClass
{
    private Timer m_timer;

    public SomeClass()
    {           
        m_timer = new Timer();
        m_timer.Interval = 1000;
        m_timer.Elapsed += new ElapsedEventHandler(m_timer_Elapsed);
        m_timer.AutoReset = false;
        m_timer.Start();                       
    }

    public void DoSomething()
    {

    }

    private void m_timer_Elapsed(object sender, ElapsedEventArgs e)
    {
        try
        {
            //Do some task
        }
        catch (Exception ex)
        {
            //Ignore
        }
        finally
        {
            if (m_timer != null)
            {
                //Restart the timer
                m_timer.Enabled = true;
            }
        }
    }
}
4

7 に答える 7

31

一般的に言えば、使い捨てのリソースは常に処分する必要があります。あなたが上で概説した場合、私は確かに探しています。タイマーを実装するクラスに IDisposable を実装すると、そのクラスを using ステートメントで使用できます。つまり、クラスが破棄されるとリソースが明示的に解放されます。

于 2009-01-24T09:08:19.620 に答える
28

1 年前にこの質問をされたようですが、私の 2 セントの価値を入れさせてください。インフレのためにわずかに少ない:)。最近、アプリケーションでタイマーを破棄していないことに気付きました。オブジェクトのコレクションがあり、各オブジェクトにはタイマーがありました。コレクションから項目を削除したとき、ガベージ コレクションを行うべきだと考えました。何らかの理由で、タイマーではそうではありません。オブジェクトが実際にガベージ コレクションされる前に、タイマーを取り除くために、コレクション内のオブジェクトに対して dispose を呼び出す必要がありました。

于 2010-05-21T08:33:13.163 に答える
8

私が使用する経験則は、IDisposable オブジェクトを持つもの、IDisposable 自体を作成することです (そして、Dispose が明示的に呼び出された場合にのみ、子オブジェクトを破棄します)。

IDisposable については、 Joe Duffy のブログで適切な議論が行われており、優れたFramework Design Guidelinesブックの私のコピーに非常によく似たコード サンプルがあります。

于 2009-01-24T12:15:43.093 に答える
4

タイマーを破棄する必要があります。そうしないと、タイマーを「終了」した後もしばらくの間タイマーが起動し続けます。ただし、スレッドの問題により、廃棄した後も短時間で起動する場合があります。

于 2010-11-25T12:36:12.773 に答える
2

タイマー オブジェクトは、タイマー イベントを発生させる目的でワーカー スレッドを作成または使用していると思います。dispose 呼び出しは、スレッドとそれに関連付けられているリソースを解放します。その場合は、dispose を呼び出すことをお勧めします。これにより、未使用のスレッドが長時間滞留することがなくなります。

于 2009-01-24T09:15:01.510 に答える
2

idisposable を実装することで、タイマーなどの idisposable も実装する内部リソースを片付けることができます。

さらに、using ステートメントを使用するように呼び出しコードを変更することもできます。

using (SomeClass someClass = new SomeClass())
{  
someClass.DoSomething();  
}  
于 2009-01-24T09:50:49.067 に答える
1

私はローランドに同意します。

FxCop には、Disposable オブジェクトを含むが IDisposable を適切に実装していないクラスを見つけるルールがあります。

于 2009-04-29T17:37:26.810 に答える