C#终止实现Dispatchermer的类库

C#终止实现Dispatchermer的类库,c#,kill,class-library,C#,Kill,Class Library,我使用类库来模拟和处理数据,并通过触发事件返回结果 DataProcessor _dataProcessor 在其中,我使用一个调度器来模拟数据,并在模拟数据可用并准备好推送到GUI时引发事件 想知道如何最好地杀死数据处理器 我的经验就是这样 _dataProcessor = null; 不会杀死调度员。事件仍然会引发并传递给GUI 在GAC处理类库之前,我是否必须停止/清空Dispatcher 感谢您提供的指导,因为我不确定通常执行此任务的最佳方式,但仅根据需要终止类库实例。您的数据处理器

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

DataProcessor _dataProcessor
在其中,我使用一个调度器来模拟数据,并在模拟数据可用并准备好推送到GUI时引发事件

想知道如何最好地杀死数据处理器

我的经验就是这样

_dataProcessor = null;
不会杀死调度员。事件仍然会引发并传递给GUI

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


感谢您提供的指导,因为我不确定通常执行此任务的最佳方式,但仅根据需要终止类库实例。

您的
数据处理器
类应实现
IDisposable
接口-

然后,当您想要终止
数据处理器
类时,可以调用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

您的
DataProcessor
类应该实现
IDisposable
接口-

然后,当您想要终止
数据处理器
类时,可以调用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

我在标准.NET类列表中找不到
Dispatchermer
,所以我假设它是您自己的类。如果是这种情况,那么标准模式是让您的
Dispatcher
类实现
IDisposable
,然后在不再需要它时调用
\u dataProcessor.Dispose()
,或者通过
使用
关键字来处理它。我在标准.NET类列表中找不到
Dispatcher
,所以我想这是你自己的课。如果是这种情况,那么标准模式是让您的
Dispatchermer
类实现
IDisposable
,然后在不再需要时调用
\u dataProcessor.Dispose()
,或者通过
使用
关键字Dispatchermer在启用时保持自身活动,即使你没有提到它。非常重要的是,除非明确要求计时器停止(),否则没有人希望计时器停止引发事件。它通过向调度器保存的私有列表中添加对自身的引用来实现。并删除Stop()中的引用

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


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

Dispatcher在启用时保持自身活动,即使您没有保留对它的引用。非常重要的是,除非明确要求计时器停止(),否则没有人希望计时器停止引发事件。它通过向调度器保存的私有列表中添加对自身的引用来实现。并删除Stop()中的引用

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


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

galets和EkoostikMartin已经回答了这个问题。让我更详细地解释一下使用
-语句的
。在c#中的两个不同语句中使用了相同的关键字。我不会讨论
使用这里。另一种方法可以在方法中使用。假设
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
留下,则甚至会调用Dispose


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

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

galets和EkoostikMartin已经回答了这个问题。让我更详细地解释一下使用
-语句的
。在c#中的两个不同语句中使用了相同的关键字。我不会讨论
使用这里。另一种方法可以在方法中使用。假设
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
留下,则甚至会调用Dispose


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

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

不,
DispatchTimer
是一个WPF类,但是它是.Net framework的一部分,并且它没有实现
IDisposable
。不,
DispatchTimer
是一个WPF类,但是它是.Net framework的一部分,并且它没有实现
IDisposable
DispatchTimer
是一个WPF类,而且它没有实现IDisposable。这使你的例子令人困惑。@EkoostikMartin:好的,你是对的。我在
System.Windows.Threading
中找到了
DispatchTimer
。事实上,它没有像您所说的那样实现IDisposable。但是,由于该类不是密封的,因此可以很容易地从中派生出自己的类,并实现
IDisposable
DispatchTimer
是一个WPF类,但它不实现IDisposable。这使你的例子令人困惑。@EkoostikMartin:好的,你是对的。我在
System.Windows.Threading
中找到了
DispatchTimer
。事实上,它没有像您所说的那样实现IDisposable。但是,由于该类不是密封的,因此可以很容易地从中派生出自己的类并实现