代码之家  ›  专栏  ›  技术社区  ›  faldeland

C#终止实现DispatcherTimer的类库

  •  0
  • faldeland  · 技术社区  · 12 年前

    我使用类库来模拟和处理数据,并通过触发事件返回结果。

    DataProcessor _dataProcessor
    

    在它中,我使用DispatcherTimer来模拟数据,并在模拟数据可用并准备好推送到GUI时引发事件。

    想知道如何最好地杀死_dataProcessor?

    我的经验是

    _dataProcessor = null;
    

    不会终止DispatcherTimer。事件仍然被引发,并且仍然被传递到GUI。

    在GAC处理类库之前,我是否必须停止/清空DispatcherTimer?

    感谢您的指导,因为我不确定处理这项任务的最佳方法,更不用说根据需要终止类库的实例了。

    4 回复  |  直到 12 年前
        1
  •  2
  •   Hans Passant    12 年前

    DispatcherTimer在启用时保持其活动状态,即使您没有保留对它的引用。更重要的是,除非明确要求计时器停止(),否则没有人希望计时器停止引发事件。它通过将对自身的引用添加到私有列表<>由调度员保管。并在Stop()中删除该引用。

    这反过来确保DataProcessor在具有非静态Tick事件处理程序的情况下不会被垃圾收集。将保留的引用设置为null无效,Dispatcher和事件代理保留的引用会使对象保持活动状态。

    您需要向DataProcessor添加一个停止计时器的方法。

        2
  •  1
  •   EkoostikMartin    12 年前

    你的 DataProcessor 类应该实现 IDisposable 接口- http://msdn.microsoft.com/en-us/library/system.idisposable.aspx

    然后,当您想终止您的 数据处理器

    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
    
        3
  •  0
  •   galets    12 年前

    我找不到 DispatcherTimer 在标准.NET类列表中,所以我假设它是您自己的类。如果是这种情况,那么标准模式适用于 定时器 要实现的类 IDisposable ,然后打电话 _dataProcessor.Dispose() 当您不再需要它时,或通过 using 关键字

        4
  •  0
  •   Community CDub    4 年前

    galets和EkostikMartin已经回答了这个问题。让我解释一下 using -更详细的声明。c中的两个不同语句中使用了相同的关键字。我不讨论 using <namesapce>; 在这里另一种可以在方法中使用。假设 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();
           }
       }
    }
    

    它为你提供了一种安全的方式来关闭或终止你打开或启动的东西。如果在using块内发生异常,或者如果using块由 return 例如


    更新

    正如EkostikMartin在评论中所说, 调度计时器 不执行 I可分发 但你可以很容易地创建一个一次性版本

    public class DisposableDispatchTimer : DispatchTimer, IDisposable
    {
        public void Dispose()
        {
            Stop();
        }
    }