0

クラス ライブラリを使用してデータをシミュレートおよび処理し、トリガーされたイベントを介して結果を返します。

DataProcessor _dataProcessor

その中で、DispatcherTimer を使用してデータをシミュレートし、シミュレートされたデータが利用可能で GUI にプッシュする準備ができたときにイベントを発生させます。

_dataProcessor を強制終了する最善の方法を考えていましたか?

私の経験はその設定です

_dataProcessor = null;

DispatcherTimer を強制終了しません。イベントは引き続き発生し、GUI に渡されます。

GAC がクラス ライブラリを破棄する前に、DispatcherTimer を停止または無効にする必要がありますか?

一般的にこのタスクにアプローチする最善の方法がわからないため、ご指導いただきありがとうございます。クラス ライブラリのインスタンスをオンデマンドで終了するだけです。

4

4 に答える 4

2

DispatcherTimer は、参照を保持していなくても、有効になっている間はそれ自体を維持します。むしろ重要なことは、Stop() を明示的に要求しない限り、タイマーがイベントの発生を停止することを期待する人は誰もいないということです。Dispatcher が保持するプライベート List<> に自身への参照を追加することで、これを行います。そして、Stop() でその参照を削除します。

これにより、DataProcessor に非静的 Tick イベント ハンドラーがある場合、ガベージ コレクションが行われないことが保証されます。保持する参照を null に設定しても効果はありません。Dispatcher とイベント デリゲートによって保持される参照は、オブジェクトを存続させます。

タイマーを停止するメソッドを DataProcessor に追加する必要があります。

于 2012-07-23T20:03:46.623 に答える
1

あなたのDataProcessorクラスはIDisposableインターフェイスを実装する必要があります - http://msdn.microsoft.com/en-us/library/system.idisposable.aspx

次に、クラスを強制終了したいときに DispatchTimer.Stop() を呼び出すことができますDataProcessor

public class DataProcessor : IDisposable
{
    private bool disposed = false; 
    DispatchTimer timer;

    protected virtual void Dispose(bool disposing)
    {
        if (!disposed)
        {
            if (disposing)
            {
                if(timer != null)
                   timer.Stop();
            }

            disposed = true;
        }
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    ~DataProcessor()
    {
        Dispose(false);
    }
}

これを使って:

using(DataProcessor process = new DataProcessor)
{
     //etc...
} //stop timer
于 2012-07-23T19:54:03.273 に答える
0

DispatcherTimer標準の .NET クラス リストにないので、独自のクラスであると仮定します。この場合、標準パターンはDispatcherTimerクラスが を実装し、不要になったときにIDisposable呼び出すか、キーワードを使用して破棄します_dataProcessor.Dispose()using

于 2012-07-23T19:55:09.560 に答える
0

galets と EkoostikMartin はすでに質問に答えています。using- ステートメントについて詳しく説明します。この同じキーワードが、C# の 2 つの異なるステートメントで使用されています。ここでは議論しませんusing <namesapce>;。もう 1 つはメソッドで使用できます。DispatchTimer実装すると仮定するとIDisposable:

using (var timer = new DispatchTimer()) {
    timer.Start();
    // ... do something here.
}

と同じことをします

{
   var timer = new DispatchTimer();
   try {
       timer.Start();
       // ... do something here.
   } finally {
       if (timer != null) {
           ((IDisposable)timer).Dispose();
       }
   }
}

これにより、開いたり開始したりしたものを安全に閉じたり終了したりできます。Dispose は、using ブロック内で例外が発生した場合、または using ブロックreturnがたとえば残されている場合にも呼び出されます。


アップデート

EkoostikMartin がコメントで述べているように、DispatchTimer実装していませんIDisposableが、使い捨てバージョンを簡単に作成できます

public class DisposableDispatchTimer : DispatchTimer, IDisposable
{
    public void Dispose()
    {
        Stop();
    }
}
于 2012-07-23T20:10:55.940 に答える