Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 重置和处置可观察用户、反应式扩展_C#_Observable_System.reactive - Fatal编程技术网

C# 重置和处置可观察用户、反应式扩展

C# 重置和处置可观察用户、反应式扩展,c#,observable,system.reactive,C#,Observable,System.reactive,假设我有这个: public class UploadDicomSet { public UploadDicomSet() { var cachCleanTimer = Observable.Interval(TimeSpan.FromMinutes(2)); cachCleanTimer.Subscribe(CheckUploadSetList); //Start subscriber } void C

假设我有这个:

    public class UploadDicomSet 
{ 
    public UploadDicomSet()
    {
        var cachCleanTimer = Observable.Interval(TimeSpan.FromMinutes(2));
        cachCleanTimer.Subscribe(CheckUploadSetList);
        //Start subscriber
    }
    void CheckUploadSetList(long interval)
    {
        //Stop and dispose subscriber
    }
    public void AddDicomFile(SharedLib.DicomFile dicomFile)
    {
        //Renew subscriber, call CheckUploadSetList 2 minutes later
    }
}
1-在
检查UploadSetList
中,我想处理或完成observable

2-在
AddDicomFile
中,我想重置它

作为方法中的注释

更新:

我可以通过
Timer
完成,如下所示:

 public class UploadDicomSet : ImportBaseSet
{
    Timer _timer;
    public UploadDicomSet()
    {
        _timer = new Timer(CheckUploadSetList, null, 120000, Timeout.Infinite);
    }

    void CheckUploadSetList(object state)
    {
        Logging logging = new Logging(LogFile);
        try
        {
            _timer.Dispose(); //Stop the subscription
                              //dispose everything
        }
        catch (Exception exp)
        {
            logging.Log(ErrorCode.Error, "CheckUploadSetList() failed..., EXP:{0}", exp.ToString());
        }
    }
    public void AddDicomFile(SharedLib.DicomFile dicomFile)
    {
        _timer.Change(120000, Timeout.Infinite);
    }
}

提前感谢。

对我来说,将反应式扩展用于一些计时器功能似乎有点过头了。为什么不使用一个普通的计时器,并在给定的时间启动/停止它呢

让我给你一个想法

public class UploadDicomSet : ImportBaseSet
{
    IDisposable subscription;

    public void CreateSubscription()
    {
        var cachCleanTimer = Observable.Interval(TimeSpan.FromMinutes(2));

        if(subscription != null)
            subscription.Dispose();

        subscription = cachCleanTimer.Subscribe(s => CheckUploadSetList(s));
    }

    public UploadDicomSet()
    {
        CreateSubscription();
        // Do other things
    }

    void CheckUploadSetList(long interval)
    {
        subscription.Dispose(); // Stop the subscription
        // Do other things
    }

    public void AddDicomFile(SharedLib.DicomFile dicomFile)
    {
        CreateSubscription(); // Reset the subscription to go off in 2 minutes from now
        // Do other things
    }
}
背景材料

我真的可以推荐这些网站:


您应该使用
Switch()
进行此类操作

大概是这样的:

public class UploadDicomSet : ImportBaseSet
{
    IDisposable subscription;
    Subject<IObservable<long>> subject = new Subject<IObservable<long>>();

    public UploadDicomSet()
    {
        subscription = subject.Switch().Subscribe(s => CheckUploadSetList(s));
        subject.OnNext(Observable.Interval(TimeSpan.FromMinutes(2)));
    }

    void CheckUploadSetList(long interval)
    {
        subject.OnNext(Observable.Never<long>());
        // Do other things
    }

    public void AddDicomFile(SharedLib.DicomFile dicomFile)
    {
        subject.OnNext(Observable.Interval(TimeSpan.FromMinutes(2)));
        // Reset the subscription to go off in 2 minutes from now
        // Do other things
    }
}
public类上载dicom集:ImportBaseSet
{
可授权订阅;
主题=新主题();
公共上载dicom集()
{
subscription=subject.Switch().subscripte(s=>CheckUploadSetList);
受试者.OnNext(可观察的时间间隔(时间跨度从分钟(2))开始);
}
void CheckUploadSetList(长间隔)
{
subject.OnNext(Observable.Never());
//做其他事情
}
public void AddDicomFile(SharedLib.DicomFile DicomFile)
{
受试者.OnNext(可观察的时间间隔(时间跨度从分钟(2))开始);
//将订阅重置为在2分钟后启动
//做其他事情
}
}

有人能告诉我为什么投反对票吗?他们几乎从来没有这样做过,遗憾的是,尽管它不起作用,但使用Option2,
检查上传设置列表
每2分钟调用一次,即使在
订阅之后也是如此。Dispose()
。感谢您的关注,我没有测试选项1,我正在调试它并在那里设置断点,它正在调用infinity,关于选项1,我将测试它并通知您结果。让我发布我的测试代码,我想呼叫
CheckUploadSetList
如果两分钟内没有更改,则在
AddDicomFile
中,新的更改到达,因此订户应在两分钟后续订,如果
CheckUploadSetList
有一次打电话给我,我想把所有东西都放在那里,我做了选项2,它不起作用,我会测试两个选项,并告诉你反馈。我更新了我的答案,它模仿了计时器的功能是的,就是说,它对你的新更新很有吸引力。谢谢你的回答,
switch
真正能做什么?@Aria-
.switch()
切换到最新的内部可观察对象。因此,它仅通过输出最新内部可观测值,将
IObservable
展平为
IObservable
。这意味着您不必取消订阅和重新订阅就可以从observable.Up+获取全新的值,因此您认为它比old@Aria-它更健壮。如果您使用它将可观察(
subject.Switch()
)传递出类,那么您不知道谁订阅了它,但它仍然会生成值。另一个类你必须知道谁已经订阅了它们。这有意义吗?