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()
)传递出类,那么您不知道谁订阅了它,但它仍然会生成值。另一个类你必须知道谁已经订阅了它们。这有意义吗?