![](/img/trans.png)
[英]How do I dispose of my Controllers when their fields implement IDisposable?
[英]How can I dispose the IDisposable in my code?
在我一直在研究的以下類的CreateRegistryObservable
方法中,我無法弄清楚如何清楚IDisposable
以下行分配的IDisposable
。 問題在於我在作為onComplete
委托指定的Action
引用它,該委托使用{null}初始化捕獲聲明的數組變量,並且在最后調用Schedule()
返回的內容的賦值不會反映在調用此Action的時間。 如何清潔地處理調度程序?
scheduler[0] = Scheduler.CurrentThread.Schedule(iterator);
public class RegistryKeyMonitor<T> : IObservable<T>
{
private readonly RegistryKey _registryKey;
private readonly string _name;
private readonly TimeSpan _timeSpan;
private readonly ILog _logger = LogManager.GetLogger("RegistryKeyMonitor");
public RegistryKeyMonitor(RegistryKey registryKey, string name, TimeSpan timeSpan)
{
_registryKey = registryKey;
_name = name;
_timeSpan = timeSpan;
}
public IDisposable Subscribe(IObserver<T> observer)
{
var sub =CreateRegistryObservable(_registryKey, _name, _timeSpan)
//.Catch(Observable.Empty<object>())
.Where(obj => obj != null)
.Cast<T>();
return sub.Subscribe(observer);
}
private IObservable<object> CreateValueChangeObservable(RegistryKey registryKey, string name, object initialValue,
TimeSpan timeSpan, CancellationToken token)
{
return Observable.Create<object>(o =>
{
var scheduler = Scheduler.Immediate;
Action<object, Action<object, TimeSpan>> iterator = (current, self) =>
{
try
{
if (token.IsCancellationRequested)
{
o.OnCompleted();
return;
}
var value = registryKey.GetValue(name);
_logger.DebugFormat("{0} == registryKey.GetValue(name)", value);
if (current == null && value != null ||
current != null && !current.Equals(value))
{
_logger.DebugFormat("passing data {0}", value);
o.OnNext(value);
}
else
self(value, timeSpan);
}
catch (Exception e)
{
o.OnError(e);
}
};
return scheduler.Schedule(initialValue, timeSpan, iterator);
});
}
public IObservable<object> CreateRegistryObservable(RegistryKey registryKey, string name, TimeSpan timeSpan)
{
return Observable.Create<object>(o =>
{
var cancel = new CancellationDisposable();
return new CompositeDisposable(cancel,
NewThreadScheduler.Default.Schedule(() =>
{
IDisposable[] scheduler = {null};
var currentStateSubscription = new SerialDisposable();
object currentValue = null;
Action<Action> iterator = self =>
currentStateSubscription.Disposable =
CreateValueChangeObservable(registryKey, name, currentValue,
timeSpan, cancel.Token)
.Subscribe(value =>
{
currentValue = value;
self();
o.OnNext(value);
},
o.OnError,
()=> {
currentStateSubscription.Dispose();
scheduler[0].Dispose();
}
);
scheduler[0] = Scheduler.CurrentThread.Schedule(iterator);
}));
});
}
}
我只是想出了自己,這是以下幾點。
public IObservable<object> CreateRegistryObservable(RegistryKey registryKey, string name, TimeSpan timeSpan)
{
return Observable.Create<object>(o =>
{
var cancel = new CancellationDisposable();
var currentStateSubscription = new SerialDisposable();
object currentValue = null;
return new CompositeDisposable(cancel, NewThreadScheduler.Default.Schedule(
self => currentStateSubscription.Disposable =
CreateValueChangeObservable(registryKey, name, currentValue,
timeSpan, cancel.Token)
.Subscribe(value =>
{
currentValue = value;
self();
o.OnNext(value);
},
o.OnError,
currentStateSubscription.Dispose
)
));
});
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.