0

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

DataProcessor _dataProcessor

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

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

我的经验是这样设置

_dataProcessor = null;

不会杀死 DispatcherTimer。事件仍会引发并仍传递给 GUI。

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

感谢您的任何指导,因为我不确定一般来说处理此任务的最佳方法,但单独按需终止类库的实例。

4

4 回答 4

2

DispatcherTimer 在启用时会保持活动状态,即使您不保留对它的引用。相当重要的是,除非明确要求它停止(),否则没有人希望计时器停止引发事件。它通过将对自身的引用添加到由 Dispatcher 保存的私有 List<> 中来实现。并在 Stop() 中删除该引用。

如果 DataProcessor 具有非静态 Tick 事件处理程序,这反过来又可以确保您的 DataProcessor 不会被垃圾收集。将您保留的引用设置为 null 无效,Dispatcher 保留的引用和事件委托使对象保持活动状态。

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

于 2012-07-23T20:03:46.623 回答
1

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

然后,当您想杀死您的DataProcessor班级时,您可以调用 DispatchTimer.Stop() 。

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# 中的两个不同语句中使用了相同的关键字。我不会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 块被遗弃,则 Dispose 甚至会被调用return


更新

正如 EkoostikMartin 在他的评论中所说,DispatchTimer没有实现IDisposable,但您可以轻松创建它的一次性版本

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