Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.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#_System.reactive_Idisposable_.net 5_Rx.net - Fatal编程技术网

C# 可观测计时器

C# 可观测计时器,c#,system.reactive,idisposable,.net-5,rx.net,C#,System.reactive,Idisposable,.net 5,Rx.net,我正在使用反应式.NET扩展,我想知道它的处理方法。我知道在某些情况下,这样处理它是很好的:。TakeUntilObservable.TimerTimeSpan.FromMinutesx。我 第一例 在本例中,我有一个计时器,它在x秒后触发,然后它完成并应该被释放 public void scheduleOrderCancellationIfNotFilled字符串对,长orderId,int waitSecondsBeforeCancel { Observable.TimerTimeSpan.

我正在使用反应式.NET扩展,我想知道它的处理方法。我知道在某些情况下,这样处理它是很好的:。TakeUntilObservable.TimerTimeSpan.FromMinutesx。我

第一例 在本例中,我有一个计时器,它在x秒后触发,然后它完成并应该被释放

public void scheduleOrderCancellationIfNotFilled字符串对,长orderId,int waitSecondsBeforeCancel { Observable.TimerTimeSpan.FromSecondsWaitsSecondsBeforeCancel .Doe=> { var result=_client.Spot.Order.GetOrderpair,orderId; 如果结果是成功的 { 如果结果.Data?.Status!=订单状态.Filled { _client.Spot.Order.CancelOrderpair,orderId; } } } 订阅 } 第二种情况 在这种情况下,计时器在第一秒运行,然后每隔29分钟重复一次。它应该一直存在,直到它的定义类被释放。我相信这个应该通过IDisposable实现来处理。怎么做

var keepAliveListenKey=Observable.TimerTimeSpan.fromsseconds1,TimeSpan.fromsminutes29 .Doasync e=> { wait keepalivelistinkyasync.configurewaitfalse; } 订阅 编辑 我还希望它使用一个主题,使其更容易处置和重置订阅

例如,神秘性

公共类UploadDicom集:ImportBaseSet { 可授权订阅; 科目=新科目; 公共上传光盘集 { subscription=subject.Switch.subscriptes=>checkuploadsetlist; subject.OnNextObservable.IntervalTimeSpan.FromMinutes2; } void CheckUploadSetListlong interval { subject.OnNextObservable.Never; //做其他事情 } public void AddDicomFileSharedLib.DicomFile DicomFile { subject.OnNextObservable.IntervalTimeSpan.FromMinutes2; //将订阅重置为在2分钟后启动 //做其他事情 } } 神秘性

Subscribe扩展方法返回的一次性数据只允许您在可观测数据自然结束之前手动取消对可观测数据的订阅

如果observable完成了(无论是OnCompleted还是OnError),那么订阅已经为您处理好了

需要注意的一件重要事情是:垃圾收集器从不对可观察订阅调用.Dispose,因此,如果订阅没有或可能没有在订阅超出范围之前自然结束,则必须处理订阅

第一例 看起来我不需要手动处理。在第一种情况下处置订阅,因为它会自然结束

在结束时将触发Dispose

var xs=Observable.Createo=> { var d=可观测的时间间隔从秒开始5 .Doe=> { Console.WriteLine5秒已过。; } .认购; return.Create=> { 控制台。WriteLineDisposed!; d、 处置; }; }; var subscription=xs.subscriptbex=>Console.WriteLinex; 第二种情况 但是在第二种情况下,如果它不是自然结束的,我应该处理它

除非手动处置,否则不会触发处置

var xs=Observable.Createo=> { var d=可观测的.TimerTimeSpan.FromSeconds1,TimeSpan.FromSeconds1 .Doe=> { 控制台。WriteLineTest。; } .认购; return.Create=> { 控制台。WriteLineDisposed!; d、 处置; }; }; var subscription=xs.subscriptbex=>Console.WriteLinex; 结论 他举了这么好的例子,如果你问自己同样的问题,那就值得一看。

@Enigmativity

Subscribe扩展方法返回的一次性数据只允许您在可观测数据自然结束之前手动取消对可观测数据的订阅

如果observable完成了(无论是OnCompleted还是OnError),那么订阅已经为您处理好了

需要注意的一件重要事情是:垃圾收集器从不对可观察订阅调用.Dispose,因此,如果订阅没有或可能没有在订阅超出范围之前自然结束,则必须处理订阅

第一例 看起来我不需要手动处理。在第一种情况下处置订阅,因为它会自然结束

在结束时将触发Dispose

var xs=Observable.Createo=> { var d=可观测的时间间隔从秒开始5 .Doe=> { Console.WriteLine5秒已过。; } .认购; return.Create=> { 控制台。WriteLineDisposed!; d、 处置; }; }; var subscription=xs.subscriptbex=>Console.WriteLinex; 第二种情况 但是在第二种情况下,如果它不是自然结束的,我应该处理它

处置不是 触发,除非手动处理

var xs=Observable.Createo=> { var d=可观测的.TimerTimeSpan.FromSeconds1,TimeSpan.FromSeconds1 .Doe=> { 控制台。WriteLineTest。; } .认购; return.Create=> { 控制台。WriteLineDisposed!; d、 处置; }; }; var subscription=xs.subscriptbex=>Console.WriteLinex; 结论
他举了一个很好的例子,如果你问自己同样的问题,值得一看。

在第一种情况下,它会自动处理。实际上,这是实现自动订阅管理的一种常见方法,这绝对是处理rx的好方法

在第二种情况下,您的设计过度。Observable.TimerTimeSpan.FromSeconds1,TimeSpan.FromSeconds1本身足以随时间生成一系列递增的长序列。由于此流本质上是无止境的,因此您需要正确的显式订阅管理。因此,具备以下条件就足够了:

var sub=可观测的.TimerTimeSpan.FromSeconds1,TimeSpan.FromSeconds1.Subscribe

…和sub.稍后处理

请注意,在代码中,您可以使用.Do async/wait。很可能这不是你想要的。您希望SelectMany确保正确等待异步操作并处理异常

在评论部分回答您的问题:

用主语代替怎么办

嗯,没什么特别的。IObserver和IObservable都是由这个类实现的,因此它类似于要调用某个事件的经典.NET事件回调列表。它与您的问题和用例在任何意义上都没有区别


您可以举一个关于.Do异常处理的例子吗

当然。其思想是,您希望将封装到某个任务中的async/Wait转换为IObservable,这样is就可以保留取消和错误信号。为此,必须像LINQ中的SelectMany一样使用SelectMany方法,这是相同的想法。所以只需更改你的.Do to.SelectMany

我又糊涂了。我需要IObservable Select还是IObservable SelectMany

最有可能的是,你不需要开关。为什么?因为创建它主要是为了避免IO竞争条件,因此每当发出新事件时,由于自然并行或异步工作流而可能正在进行的当前事件都会被取消,即取消订阅。否则,比赛条件会损害你的状态


相反,SelectMany将确保所有这些事件都是按顺序发生的,以它们确实到达的总顺序进行。不会取消任何活动。如果希望当前回调,您将完成等待,然后触发下一个回调。当然,这种行为可以通过适当的IScheduler来改变,但那是另一回事。

在第一种情况下,它将被自动处理。实际上,这是实现自动订阅管理的一种常见方法,这绝对是处理rx的好方法

在第二种情况下,您的设计过度。Observable.TimerTimeSpan.FromSeconds1,TimeSpan.FromSeconds1本身足以随时间生成一系列递增的长序列。由于此流本质上是无止境的,因此您需要正确的显式订阅管理。因此,具备以下条件就足够了:

var sub=可观测的.TimerTimeSpan.FromSeconds1,TimeSpan.FromSeconds1.Subscribe

…和sub.稍后处理

请注意,在代码中,您可以使用.Do async/wait。很可能这不是你想要的。您希望SelectMany确保正确等待异步操作并处理异常

在评论部分回答您的问题:

用主语代替怎么办

嗯,没什么特别的。IObserver和IObservable都是由这个类实现的,因此它类似于要调用某个事件的经典.NET事件回调列表。它与您的问题和用例在任何意义上都没有区别


您可以举一个关于.Do异常处理的例子吗

当然。其思想是,您希望将封装到某个任务中的async/Wait转换为IObservable,这样is就可以保留取消和错误信号。为此,必须像LINQ中的SelectMany一样使用SelectMany方法,这是相同的想法。所以只需更改你的.Do to.SelectMany

我又糊涂了。我需要IObservable Select还是IObservable SelectMany

最有可能的是,你不需要开关。为什么?因为创建它主要是为了避免IO竞争条件,因此每当发出新事件时,由于自然并行或异步工作流而可能正在进行的当前事件都会被取消,即取消订阅。否则,比赛条件会损害你的状态

相反,SelectMany将确保所有这些事件都是按顺序发生的,以它们确实到达的总顺序进行。没有什么是可以改变的
牢房。如果希望当前回调,您将完成等待,然后触发下一个回调。当然,这种行为可以通过适当的isScheduler来改变,但那是另一回事。

我没有使用该库,但是任何实现IDisposable的类都应该在某个时候被释放,所以保留一个引用并释放它。显然,不应该处理未实现该接口的对象。您的确切要求是什么?它实现了它,但是在Dispose中执行它的正确方法是什么,特别是在第二种情况下如果myReferencedObject!=null myReferencedObject.Dispose?只需在处理完dispose后调用它,或者在关闭应用程序时调用它。另外,Do操作符不支持异步委托。lambda通过了。还要注意的是,当您订阅一个observable而不提供onError处理程序时,任何可能发生的异常都将未经处理,其效果与传统事件处理程序中未经处理的异常相同。它将使进程崩溃。我不使用该库,但任何实现IDisposable的类都应该在某个时候被释放,因此保留一个引用并释放它。显然,不应该处理未实现该接口的对象。您的确切要求是什么?它实现了它,但是在Dispose中执行它的正确方法是什么,特别是在第二种情况下如果myReferencedObject!=null myReferencedObject.Dispose?只需在处理完dispose后调用它,或者在关闭应用程序时调用它。另外,Do操作符不支持异步委托。lambda通过了。还要注意的是,当您订阅一个observable而不提供onError处理程序时,任何可能发生的异常都将未经处理,其效果与传统事件处理程序中未经处理的异常相同。它将使进程崩溃。使用Subject进行处理如何?请给出一个有关async SelectMany而不是.Do的示例,是否有异常处理?@nop请参阅更新然后更新您的问题并解释您的主题所代表的含义。我觉得你完全糊涂了。@nop-请不要在评论中提出补充问题。这使得答案很难理解。如果您需要调整您的问题,请在其后面添加。然后,每个人都可以清楚地理解所询问的内容,而无需阅读这么多评论。使用Subject来处理如何?请给出一个有关async SelectMany而不是。Do,带异常处理?@nop see Updates然后更新您的问题并解释您的Subject代表什么。我觉得你完全糊涂了。@nop-请不要在评论中提出补充问题。这使得答案很难理解。如果您需要调整您的问题,请在其后面添加。然后,每个人都可以清楚地理解所问的问题,而不需要阅读这么多评论。
Observable
    .Timer(TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(1))
    .SelectMany(_ => Observable.FromAsync(() => /* that's the point where your Task<> becomes Observable */ myTask))