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。但是,由于该类不是密封的,因此可以很容易地从中派生出自己的类并实现