簡體   English   中英

如何在我的代碼中處理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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM